{"id":519,"date":"2015-09-08T11:14:58","date_gmt":"2015-09-08T14:14:58","guid":{"rendered":"http:\/\/www.galirows.com.br\/meublog\/programacao\/?p=519"},"modified":"2021-06-18T15:41:59","modified_gmt":"2021-06-18T18:41:59","slug":"exercicio-pilha-containers","status":"publish","type":"post","link":"http:\/\/www.galirows.com.br\/meublog\/programacao\/exercicio-pilha-containers\/","title":{"rendered":"Exerc\u00edcio resolvido com pilha &#8211; gerenciar containers"},"content":{"rendered":"\n<div class=\"wp-block-image\"><figure class=\"alignleft\"><img loading=\"lazy\" decoding=\"async\" width=\"301\" height=\"200\" src=\"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-content\/uploads\/sites\/2\/2015\/09\/loading-652296_640-e1441720928385.jpg\" alt=\"loading-652296_640\" class=\"wp-image-520\"\/><\/figure><\/div>\n\n\n\n<p>Uma pequena empresa de log\u00edstica pretende implementar um porto seco para armazenar containers e precisa para um programa simples para gerenciar seu porto.<\/p>\n\n\n\n<p>Dado o tamanho da empresa, essa possui apenas 4 locais onde pode empilhar os containers e seu equipamento permite empilhar no m\u00e1ximo 3 containers.<\/p>\n\n\n\n<p>Por pol\u00edtica da empresa, um novo container deve ser colocado no local com a pilha mais baixa dispon\u00edvel (se mais de um local tiver a mesma quantidade de containers, tanto faz em que pilha ser\u00e1 adicionado).<\/p>\n\n\n\n<p>Cada container \u00e9 adicionado a partir de um c\u00f3digo informado e o sistema n\u00e3o pode permitir c\u00f3digos repetidos. Para&nbsp; remo\u00e7\u00e3o tamb\u00e9m \u00e9 preciso informar o c\u00f3digo do container, mas o mesmo somente ser\u00e1 removido se estiver no topo da pilha.<\/p>\n\n\n\n<p>O algoritmo deve mostrar as seguintes mensagens:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Codigo invalido!:<\/strong> quando for fornecido um valor j\u00e1 existe no momento de inser\u00e7\u00e3o e quando for fornecido um valor n\u00e3o existente no momento de remo\u00e7\u00e3o.<\/li><li><strong>Impossivel empilhar!:<\/strong> quando n\u00e3o for mais poss\u00edvel adicionar containers nas pilhas.<\/li><li><strong>Impossivel desempilhar!:<\/strong> quando n\u00e3o for poss\u00edvel remover um container, ou por n\u00e3o existir mais containers ou por ele n\u00e3o estar no topo da pilha.<\/li><\/ul>\n\n\n\n<!--more-->\n\n\n\n<p>Uma proposta de solu\u00e7\u00e3o o enunciado acima \u00e9 mostrada a seguir. A base da manipula\u00e7\u00e3o da pilha est\u00e1 dispon\u00edvel em <a href=\"http:\/\/www.galirows.com.br\/meublog\/programacao\/estrutura-de-dados-pilha\/\" target=\"_blank\" rel=\"noopener\">Estrutura de dados: pilha<\/a>.<\/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 tamPilha 3 \/\/quantidade de containers em cada local\n#define tamPorto 4 \/\/quantidade de locais do porto seco\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 [tamPilha] ;\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\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\/\/retorna o valor que est\u00e1 em cima na pilha\nint valorTopo(PILHA p) {\n    return p.item[p.topo - 1];\n}\n\n\/\/mostra os valores armazenados na pilha\nvoid mostraPilha(PILHA p) {\n\tcout &lt;&lt; \"Valores da pilha: \";\n\tif (p.topo &gt; 0) {\n        for (int i = 0; i &lt; p.topo; i++) {\n            cout &lt;&lt; p.item[i] &lt;&lt; \" \";\n        }\n    } else {\n        cout &lt;&lt; \"pilha vazia\";\n    }\n\tcout &lt;&lt; \"\\n\";\n}\n\nvoid mostraPorto(PILHA vet[tamPorto]) {\n    for (int i = 0; i &lt; tamPorto; i++) {\n        cout &lt;&lt; \"Porto \" &lt;&lt; i+1 &lt;&lt; \" -&gt; \";\n        mostraPilha(vet[i]);\n    }\n}\n\n\/\/determina qual pilha est\u00e1 mais vazia retornando a posi\u00e7\u00e3o no vetor\nint pilhaMaisVazia(PILHA vet[tamPorto]) {\n    \/\/armazena o menor valor e que pilha (posicao) ele esta\n    int menor = vet[0].topo, posicao = 0;\n    for (int i = 1; i &lt; tamPorto; i++) {\n        if (vet[i].topo &lt; menor) {\n            menor = vet[i].topo;\n            posicao = i;\n        }\n    }\n\n    return posicao;\n}\n\nvoid mostraOpcoes() {\n    cout &lt;&lt; \"Opcoes disponiveis: \" &lt;&lt; endl;\n    cout &lt;&lt; \"0: sair\" &lt;&lt; endl;\n    cout &lt;&lt; \"1: adicionar container\" &lt;&lt; endl;\n    cout &lt;&lt; \"2: remover   container\" &lt;&lt; endl;\n    cout &lt;&lt; \"Digite sua opcao: \";\n}\n\n\/\/verifica se o c\u00f3digo est\u00e1 presente em alguma das pilhas do porto\n\/\/se existir retorna a posicao no vetor (local do porto)\nint codigoExiste(PILHA vet[tamPorto], int cod) {\n    for (int i = 0; i &lt; tamPorto; i++) {\n        for (int j = 0; j &lt; vet[i].topo; j++) {\n            if (vet[i].item[j] == cod) {\n                return i;\n            }\n        }\n    }\n    return -1; \/\/se n\u00e3o encontrar o c\u00f3digo vai retornar aqui\n}\n\nint main(){\n    PILHA local[tamPorto]; \/\/cria um vetor de pilhas\n    int opcao, codigo;\n\n    while (true) {\n        mostraOpcoes();\n        cin &gt;&gt; opcao;\n        if (opcao == 0) {\n            break;\n        }\n\n        cout &lt;&lt; \"Informe o codigo do container: \";\n        cin &gt;&gt; codigo;\n\n        if (opcao == 1) { \/\/adicionar container\n            if (codigoExiste(local, codigo) != -1) {\n                cout &lt;&lt; \"Codigo invalido\" &lt;&lt; endl; \/\/codigo fornecido j\u00e1 existente\n            } else {\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int posicaoPorto = pilhaMaisVazia(local);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (pilhaCheia(local[posicaoPorto])) {\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; \"Impossivel empilhar!\" &lt;&lt; endl; \/\/nenhum lugar vago dispon\u00edvel\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; empilha(local[posicaoPorto],codigo);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }\n        } else { \/\/remover container\n            int posicaoPorto = codigoExiste(local, codigo);\n            if (posicaoPorto == -1) {\n                cout &lt;&lt; \"Codigo invalido!\" &lt;&lt; endl; \/\/codigo fornecido n\u00e3o existente\n            } else {\n                if (valorTopo(local[posicaoPorto]) == codigo) {\n                    desempilha(local[posicaoPorto]);\n                } else {\n                    cout &lt;&lt; \"Impossivel desempilhar!\" &lt;&lt; endl; \/\/c\u00f3digo fornecido n\u00e3o esta no topo da pilha\n                }\n            }\n        }\n\n        mostraPorto(local);\n        cout &lt;&lt; \"\\n\";\n    }\n\n    return 0;\n}<\/code><\/pre>\n\n\n\n<p>Para experimentar esse c\u00f3digo online: <a href=\"http:\/\/ideone.com\/xFRsdC\" target=\"_blank\" rel=\"noopener\">http:\/\/ideone.com\/xFRsdC<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uma pequena empresa de log\u00edstica pretende implementar um porto seco para armazenar containers e precisa para um programa simples para gerenciar seu porto. Dado o tamanho da empresa, essa possui apenas 4 locais onde pode empilhar os containers e seu equipamento permite empilhar no m\u00e1ximo 3 containers. Por pol\u00edtica da empresa, um novo container deve [&hellip;]<\/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],"tags":[25,27],"class_list":["post-519","post","type-post","status-publish","format-standard","hentry","category-c","tag-estrutura-de-dados","tag-pilha"],"aioseo_notices":[],"amp_enabled":true,"_links":{"self":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/519","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=519"}],"version-history":[{"count":7,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/519\/revisions"}],"predecessor-version":[{"id":1081,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/519\/revisions\/1081"}],"wp:attachment":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/media?parent=519"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/categories?post=519"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/tags?post=519"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}