{"id":511,"date":"2015-09-07T11:11:45","date_gmt":"2015-09-07T14:11:45","guid":{"rendered":"http:\/\/www.galirows.com.br\/meublog\/programacao\/?p=511"},"modified":"2021-06-18T15:46:41","modified_gmt":"2021-06-18T18:46:41","slug":"estrutura-de-dados-pilha","status":"publish","type":"post","link":"http:\/\/www.galirows.com.br\/meublog\/programacao\/estrutura-de-dados-pilha\/","title":{"rendered":"Estrutura de dados: pilha"},"content":{"rendered":"\n<p>Artigo composto por uma apresenta\u00e7\u00e3o no Prezi explicando os conceitos b\u00e1sicos da estrutura de dados de pilha e a implementa\u00e7\u00e3o em C++ e Python do funcionamento disponibilizado na apresenta\u00e7\u00e3o. Os c\u00f3digos mostrados possuem um link para editores online e que permite o teste da execu\u00e7\u00e3o e aplica\u00e7\u00e3o de altera\u00e7\u00f5es.<\/p>\n\n\n\n<p>Link para a presenta\u00e7\u00e3o: <a href=\"https:\/\/prezi.com\/kc8opwslaedp\/?token=b0b76f4ff8c48d733687f9ae269a25cc4808ea2c9839fb30fa62cf221142a6f8\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/prezi.com\/kc8opwslaedp\/?token=b0b76f4ff8c48d733687f9ae269a25cc4808ea2c9839fb30fa62cf221142a6f8<\/a><a rel=\"noopener\" href=\"http:\/\/prezi.com\/kc8opwslaedp\/?utm_campaign=share&amp;utm_medium=copy\" target=\"_blank\"><\/a><br><\/p>\n\n\n\n<!--more-->\n\n\n\n<p><strong>C\u00f3digo em C++<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code lang:c++ decode:true\"><code lang=\"cpp\" class=\"language-cpp\">#include &lt;iostream&gt;\n#define tamanho 5\nusing namespace std;\n\n\/\/define a estrutura que ser\u00e1 a pilha\n\/\/a estrutura armazena a indica\u00e7\u00e3o do topo da pilha e um vetor com os itens (valores) da pilha\ntypedef struct{\n      int topo = 0;\n      int item [tamanho] ;\n} PILHA;\n\n\/\/retorna se a pilha est\u00e1 vazia ou n\u00e3o\nbool pilhaVazia(PILHA p){\n    if(p.topo == 0) {\n        return true;\n    } else {\n        return false;\n    }\n}\n\n\/\/retorna se a pilha est\u00e1 cheia ou n\u00e3o\nbool pilhaCheia(PILHA p) {\n\tint tam = sizeof(p.item)\/sizeof(int); \/\/determina o tamanho do vetor\n\t\n    if (p.topo &lt; tam) {\n        return false;\n    } else {\n        return true;\n    }\n}\n\n\/\/adiciona valor na pilha\nvoid empilha(PILHA &amp;p, int x){\n    p.item[p.topo++]=x;\n}\n\n\/\/remove valor da pilha\nint desempilha(PILHA &amp;p){\n    return (p.item[--p.topo]) ;\n}\n\n\/\/mostra os valores armazenados na pilha\nvoid mostraPilha(PILHA p) {\n\tcout &lt;&lt; \"Valores da pilha: \";\n\tfor (int i = 0; i &lt; p.topo; i++) {\n\t\tcout &lt;&lt; p.item[i] &lt;&lt; \" \";\n\t}\n\tcout &lt;&lt; \"\\n\";\n}\n\n\/\/C\u00f3digo para testar a implementa\u00e7\u00e3o.\nint main(){\n    PILHA s; \/\/criar a pilha\n    \n    \/\/Verificar que a pilha est\u00e1 vazia\n    if(pilhaVazia(s)) {\n        cout&lt;&lt;\"A pilha est\u00e1 vazia.\"&lt;&lt;endl;\n    } else {\n        cout&lt;&lt;\"A pilha n\u00e3o est\u00e1 vazia.\"&lt;&lt;endl;\n    }\n    \n    \/\/Empilha valor e verifica se a pilha est\u00e1 vazia\n    empilha(s,10);\n    if(pilhaVazia(s)) {\n        cout&lt;&lt;\"A pilha est\u00e1 vazia.\"&lt;&lt;endl;\n    } else {\n        cout&lt;&lt;\"A pilha n\u00e3o est\u00e1 vazia.\"&lt;&lt;endl;\n    }\n    \n    \/\/Empilhar 3 elementos\n    empilha(s,20);\n    empilha(s,30);\n    empilha(s,40);\n\n\t\/\/Mostra os valores da pilha\n    mostraPilha(s);\n    \n    \/\/Verifica que a pilha est\u00e1 cheia\n    if(pilhaCheia(s)) {\n        cout&lt;&lt;\"A pilha est\u00e1 cheia.\"&lt;&lt;endl;\n    } else {\n        cout&lt;&lt;\"A pilha n\u00e3o est\u00e1 cheia.\"&lt;&lt;endl;\n    }\n    \n    \/\/Empilha valor e verifica se a pilha est\u00e1 cheia\n    empilha(s,50);\n    mostraPilha(s);\n    if(pilhaCheia(s)) {\n        cout&lt;&lt;\"A pilha est\u00e1 cheia.\"&lt;&lt;endl;\n    } else {\n        cout&lt;&lt;\"A pilha n\u00e3o est\u00e1 cheia.\"&lt;&lt;endl;\n    }\n    \n    \/\/Desempilha e mostrar o valor desempilhado\n    cout&lt;&lt;\"Valor desempilhado: \"&lt;&lt; desempilha(s) &lt;&lt;endl;\n\n\tmostraPilha(s);\n\t\n    return 0;\n}<\/code><\/pre>\n\n\n\n<p>Teste esse c\u00f3digo: <a href=\"http:\/\/ideone.com\/e.js\/E5WrEt\" target=\"_blank\" rel=\"noopener\">http:\/\/ideone.com\/e.js\/E5WrEt<\/a><\/p>\n\n\n\n<p>Um detalha importante que utilizei na implementa\u00e7\u00e3o e que pode n\u00e3o funcionar est\u00e1 relacionado com a inicializa\u00e7\u00e3o da vari\u00e1vel <strong>topo<\/strong> dentro da <strong>struct<\/strong>. Alguns compiladores n\u00e3o permitem essa inicializa\u00e7\u00e3o. Nesse caso ser\u00e1 necess\u00e1rio adicionar a fun\u00e7\u00e3o abaixo ao c\u00f3digo e logo ap\u00f3s criar a pilha para essa fun\u00e7\u00e3o.<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c++ decode:true\"><code lang=\"cpp\" class=\"language-cpp\">\/\/.....\n\nvoid inicializaPilha(PILHA &amp;p) {\n    p.topo = 0;\n}\n\n\/\/.....\n\nint main() {\n&nbsp;&nbsp;&nbsp; PILHA s;\n&nbsp;&nbsp;&nbsp; inicializaPilha(s);\n\n\/\/.....<\/code><\/pre>\n\n\n\n<p><strong>C\u00f3digo em Python<\/strong><\/p>\n\n\n\n<p>Na implementa\u00e7\u00e3o em Python busquei manter o mais pr\u00f3ximo poss\u00edvel da implementa\u00e7\u00e3o mostrada em C++. Em Python seria poss\u00edvel utilizar uma lista em vez de vetor e n\u00e3o ter limite de elementos na pilha.<\/p>\n\n\n\n<pre class=\"wp-block-code lang:python decode:true\"><code lang=\"python\" class=\"language-python\">#define a estrutura que ser\u00e1 a pilha\n#como o Python n\u00e3o tem struct, fiz uma classe\n#a estrutura armazena a indica\u00e7\u00e3o do topo da pilha e um vetor com os itens (valores) da pilha\nTAMANHO = 5\nclass PILHA:\n    def __init__(self):\n        self.topo = 0\n        self.item = [0]*TAMANHO\n\n#retorna se a pilha est\u00e1 vazia ou n\u00e3o\ndef pilhaVazia(p):\n    if p.topo == 0:\n        return True;\n    else:\n        return False;\n\n#retorna se a pilha est\u00e1 cheia ou n\u00e3o\ndef pilhaCheia(p):\n    tam = len(p.item) #determina o tamanho do vetor\n    \n    if p.topo &lt; tam:\n        return False\n    else:\n        return True\n    \n#adiciona valor na pilha\ndef empilha(p, x):\n    p.item[p.topo] = x\n    p.topo = p.topo + 1\n\n#remove valor da pilha\ndef desempilha(p):\n    p.topo = p.topo - 1\n    return p.item[p.topo]\n\n#mostra os valores armazenados na pilha\ndef mostraPilha(p):\n    print \"Valores da pilha: \"\n    for i in range(p.topo):\n        print p.item[i], \" \",\n    print \"\\n\"\n\n#C\u00f3digo para testar a implementa\u00e7\u00e3o\ns = PILHA(); #criar a pilha\n    \n#Verificar que a pilha est\u00e1 vazia\nif pilhaVazia(s):\n    print \"A pilha est\u00e1 vazia.\\n\"\nelse:\n    print \"A pilha n\u00e3o est\u00e1 vazia.\\n\"\n    \n#Empilha valor e verifica se a pilha est\u00e1 vazia\nempilha(s,10)\nif pilhaVazia(s):\n    print \"A pilha est\u00e1 vazia.\\n\"\nelse:\n    print \"A pilha n\u00e3o est\u00e1 vazia.\\n\"\n    \n#Empilhar 3 elementos\nempilha(s,20)\nempilha(s,30)\nempilha(s,40)\n\n#Mostra os valores da pilha\nmostraPilha(s)\n    \n#Verifica que a pilha est\u00e1 cheia\nif pilhaCheia(s):\n    print \"A pilha est\u00e1 cheia.\\n\"\nelse:\n    print \"A pilha n\u00e3o est\u00e1 cheia.\\n\"\n    \n#Empilha valor e verifica se a pilha est\u00e1 cheia\nempilha(s,50)\nmostraPilha(s)\nif pilhaCheia(s):\n    print \"A pilha est\u00e1 cheia.\\n\"\nelse:\n    print \"A pilha n\u00e3o est\u00e1 cheia.\\n\"\n   \n#Desempilha e mostrar o valor desempilhado\nprint \"Valor desempilhado: \", desempilha(s), \"\\n\"\nmostraPilha(s)<\/code><\/pre>\n\n\n\n<p>Teste esse c\u00f3digo: <a href=\"http:\/\/www.codeskulptor.org\/#user40_vN80HJDaHi_0.py\" target=\"_blank\" rel=\"noopener\">http:\/\/www.codeskulptor.org\/#user40_vN80HJDaHi_0.py<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Artigo composto por uma apresenta\u00e7\u00e3o no Prezi explicando os conceitos b\u00e1sicos da estrutura de dados de pilha e a implementa\u00e7\u00e3o em C++ e Python do funcionamento disponibilizado na apresenta\u00e7\u00e3o. Os c\u00f3digos mostrados possuem um link para editores online e que permite o teste da execu\u00e7\u00e3o e aplica\u00e7\u00e3o de altera\u00e7\u00f5es. Link para a presenta\u00e7\u00e3o: https:\/\/prezi.com\/kc8opwslaedp\/?token=b0b76f4ff8c48d733687f9ae269a25cc4808ea2c9839fb30fa62cf221142a6f8<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[3,5],"tags":[25,26],"class_list":["post-511","post","type-post","status-publish","format-standard","hentry","category-c","category-python","tag-estrutura-de-dados","tag-ide-online"],"aioseo_notices":[],"amp_enabled":true,"_links":{"self":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/511","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/comments?post=511"}],"version-history":[{"count":9,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/511\/revisions"}],"predecessor-version":[{"id":1085,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/511\/revisions\/1085"}],"wp:attachment":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/media?parent=511"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/categories?post=511"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/tags?post=511"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}