<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hector Fernandes</title>
    <description>The latest articles on DEV Community by Hector Fernandes (@devhector).</description>
    <link>https://dev.to/devhector</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F365467%2F0376e4d0-402b-4b73-9813-7c414c43249b.png</url>
      <title>DEV Community: Hector Fernandes</title>
      <link>https://dev.to/devhector</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/devhector"/>
    <language>en</language>
    <item>
      <title>Estrutura de dados: Pilha dinâmica</title>
      <dc:creator>Hector Fernandes</dc:creator>
      <pubDate>Mon, 14 Dec 2020 00:44:44 +0000</pubDate>
      <link>https://dev.to/devhector/estrutura-de-dados-pilha-4m36</link>
      <guid>https://dev.to/devhector/estrutura-de-dados-pilha-4m36</guid>
      <description>&lt;p&gt;&lt;em&gt;Essa publicação serve como um resumo, para que eu possa consultar com facilidade, porém pode ser de grande ajuda aos iniciantes.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é uma pilha?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pilha&lt;/strong&gt; é uma estrutura de dado do tipo &lt;strong&gt;LIFO&lt;/strong&gt; (last-in first-out), o que significa que o último elemento colocado, será o primeiro elemento a ser retirado. Portanto, uma pilha só permite interação com o elemento do topo.   &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Exemplo disso é a imagem da capa, onde para acessar a pedra do meio é necessário retirar as pedras acima, sempre começando do topo. Outro exemplo é o mecanismo de desfazer e refazer dos editores de texto.&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Operações principais:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Criação da pilha (createStack)&lt;/li&gt;
&lt;li&gt;Inserir elemento na pilha (push)&lt;/li&gt;
&lt;li&gt;Remover elemento da pilha (pop)&lt;/li&gt;
&lt;li&gt;Mostrar topo (showTop)&lt;/li&gt;
&lt;li&gt;Imprimir pilha (printStack)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A pilha a ser desenvolvida, será uma pilha dinâmica na linguagem C.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Primeiro criamos a estrutura:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;typedef struct stack{

    int number;
    struct stack *next;

}Stack;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Vamos criar a função que cria a pilha:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Stack **createStack(){

    Stack **varStack = (Stack **)malloc(sizeof(Stack *));
    if(varStack == NULL){

        printf("\nERRO! Memoria insuficiente.\n");
        exit(1);

    }

    *varStack = NULL;

    return varStack;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Agora criaremos a função de inserir:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;void push(Stack **varStack, int data){

    Stack *elementStack = (Stack *)malloc(sizeof(Stack));
    if(elementStack == NULL){

        printf("\nERRO! Falta de memoria\n");
        exit(1);

    }

    if(isEmpty(varStack)){

        *varStack = elementStack;
        elementStack-&amp;gt;number = data;
        elementStack-&amp;gt;next = NULL;


    }else{

        elementStack-&amp;gt;next = *varStack;
        elementStack-&amp;gt;number = data;
        *varStack = elementStack;

    }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Agora a função de retirar o elemento:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;int pop(Stack **varStack, int *data){

    Stack *aux;

    if(!isEmpty(varStack)){

        aux = *varStack;
        *varStack = aux-&amp;gt;next;
        *data = aux-&amp;gt;number;

        free(aux);

        return 1;

    }

    return 0;

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;É necessário criar uma função que verifique se a pilha está vazia, então a criaremos:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;int isEmpty(Stack **varStack){

    if(varStack == NULL){

        return 1;

    }

    if(*varStack == NULL){

        return 1;

    }

    return 0;

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Para finalizar as operações principais, criaremos as funções que imprimem os elementos:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;void showTop(Stack **varStack){

    printf("\nTopo: %d\n", (*varStack)-&amp;gt;number);

}

\\-----------------------------------------------

void printStack(Stack **varStack){

    if(varStack == NULL) return;

    Stack *aux = *varStack;

    printf("\n--------------\n");

    while (aux != NULL){

        printf("\n%d", aux-&amp;gt;number);
        aux = aux-&amp;gt;next;

    }

    printf("\n\n--------------\n");


}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Fora das operações principais temos duas funções que são usadas para liberar a pilha, já que é uma pilha dinâmica:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;void stackFree(Stack **varStack){

    if(varStack == NULL) return;

    elementFree(*varStack);

    free(varStack);

}

void elementFree(Stack *elementStack){

    if(elementStack == NULL) return;

    elementFree(elementStack-&amp;gt;next);

    free(elementStack);

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;A função principal pode ser desenvolvida dessa forma:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;int main(){

    int op, data;
    Stack **varStack = createStack();

    do{

        printf("\n-----PILHA-----\n");
        printf("\n1 - Adicionar elemento na pilha.");
        printf("\n2 - Remover elemento do topo.");
        printf("\n3 - Imprimir elemento do topo.");
        printf("\n4 - Imprimir pilha.");
        printf("\n0 - Sair");
        printf("\nDigite: ");
        scanf("%d", &amp;amp;op);


        if(op == 1){

            printf("\n\nInserir elemento na pilha.");
            printf("\nDigite o numero: ");
            scanf("%d", &amp;amp;data);

            push(varStack, data);

        }else if(op == 2){

            if(pop(varStack, &amp;amp;data)){

                printf("\nElemento %d retirado.\n", data);    

            }else{

                printf("\nA pilha esta vazia.\n");

            }



        }else if(op == 3){

            showTop(varStack);

        }else if(op == 4){

            printStack(varStack);

        }

    } while (op != 0);

    stackFree(varStack);

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com isso finalizamos esse post, espero ter ajudado.&lt;br&gt;
O link para o código está aqui: &lt;a href="https://github.com/devhector/AeDI/blob/main/REVISAO/pilha.c"&gt;clique aqui!&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>computerscience</category>
      <category>algorithms</category>
    </item>
  </channel>
</rss>
