Folha prática - EAD Pilha 1 EAD Pilha A. Considere as declarações de Nodo e PNodo (adaptada dos apontamentos) seguintes: struct Nodo { int Elemento; struct Nodo *Ant; }; typedef struct Nodo *PNodo; Considere as funções relacionadas com a Estrutura Abstrata de Dados Pilha com armazenamento não sequencial usando memória dinâmica (que constam em Capítulo 3 - Estruturas de Dados sequenciais com armazenamento não sequencial www.di.ubi.pt/~cbarrico –> Programação III/Estruturas de Dados -> Apontamentos) adaptadas às declarações anteriores. - Copiar e adaptar todas as funções associadas às operações básicas de uma EAD Pilha de inteiros estudadas nas aulas teóricas para um ficheiro denominado “PilhaInteiros.h”, as quais se encontram descritas nos apontamentos disponibilizados na página web da disciplina. - Elaborar um programa que inclua o ficheiro anterior e resolva as questões colocadas a seguir, usando, sempre que possível, as funções/operações básicas mencionadas. 1. Implementar uma função para construir uma pilha S com valores inteiros positivos, inseridos a partir do teclado. 2. Usando a definição de pilha de inteiros em cima, implemente uma função que dada uma pilha S, determine o segundo elemento a partir do topo da pilha S. 3. Usando a definição de pilha de inteiros em cima, implemente uma função que dada uma pilha S, determine o segundo elemento a partir do topo da pilha S, mas deixando a pilha S inalterada. 4. Usando a definição de pilha de inteiros em cima, implemente uma função que dada uma pilha S, e dado um inteiro N, determine o N-ésimo elemento a partir do topo da pilha S. 5. Usando a definição de pilha de inteiros em cima, implemente uma função que dada uma pilha S, e dado um inteiro N, determine o N-ésimo elemento a partir do topo da pilha S, deixando a pilha S inalterada. (Sugestão: usar uma pilha auxiliar). 6. Usando a definição de pilha de inteiros em cima, implemente uma função que dada uma pilha S, determine o elemento do fundo da pilha S. 7. Usando a definição de pilha de inteiros em cima, implemente uma função de dada uma pilha S, determine o elemento do fundo da pilha, deixando a pilha inalterada. 8. Usando a definição de pilha de inteiros em cima, implemente uma função que dada uma pilha S, determine o terceiro elemento a partir do fundo da pilha S. Programação III / Estruturas de Dados Folha prática - EAD Pilha 2 9. Usando a definição de pilha de inteiros em cima, implemente uma função que dada uma pilha S, inverta a ordem dos elementos da pilha S, utilizando apenas uma estrutura auxiliar. Definir adequadamente a estrutura auxiliar e prever a possibilidade da pilha estar vazia. 10. Usando a definição de pilha de inteiros em cima, implemente uma função que dada uma pilha S, troque de lugar o elemento que está no topo da pilha S com o que está na base da pilha S. Usar apenas uma pilha auxiliar. 11. Usando a definição de pilha de inteiros em cima, implemente uma função que dada uma pilha S, coloque os números pares na base da pilha S e os ímpares no topo da pilha S. Usar duas pilhas auxiliares. 12. Usando a definição de pilha de inteiros em cima, implemente uma função que dada uma pilha S, verifique se uma expressão matemática que inclui vários conjuntos de parênteses agrupados estão balanceados (número de '(' igual ao número de ')'). Por exemplo: 7 - (( X * ((X + Y) / (J - 3)) + Y) / (4 - 2.5)) Pretende-se verificar se os parênteses estão corretamente agrupados, ou seja, se: - existe um número igual de parênteses '(' e ')'. Expressões como “A((A + B)” ou “A + B(” violam este critério. - todo o parêntese '(' é precedido por um parêntese ')' correspondente. Expressões como “)A+B(-C” ou “(A+B))-(C+D” violam este critério. Sugestão: usar dois números inteiros diferentes, um associado a '(' e o outro a ')'. 13. Usando a definição de pilha de inteiros em cima, implemente uma função que dada uma pilha S, verifique se uma expressão matemática, composta por operadores e operandos, está bem definida na notação “Infixa”. Esta notação define-se da seguinte forma: - um operador unário precede o operando; - um operador binário separa os dois operandos; - parênteses indicam prioridades. Por exemplo: (a + b) * c. 14. Usando a definição de pilha de inteiros em cima, implemente uma função que dada uma pilha S, verifique se uma expressão matemática, composta por operadores e operandos, está bem definida na notação “Pós-fixa”. Esta notação define-se da seguinte forma: os operadores seguem os operandos. Por exemplo: a b + c *. 15. Usando a definição de pilha de inteiros em cima, implemente uma função que dada uma pilha S, verifique se uma expressão matemática, composta por operadores e operandos, está bem definida na notação “Pré-fixa”. Esta notação define-se da seguinte forma: os operadores precedem os operandos. Por exemplo: * + a b c. Programação III / Estruturas de Dados Folha prática - EAD Pilha 3 B. Outros problemas 16. Implemente uma EAD Pilha e uma função para determinar se uma string de caracteres de entrada é da forma: xCy onde x é uma string consistindo nas letras 'A' e 'B' , e y é o inverso de x (isto é, se x = "ABABBA", y deve equivaler a "ABBABA"). Em cada ponto, você só poderá ler o próximo caractere da string. 17. Implemente uma EAD Pilha e uma função para determinar se uma string de caracteres de entrada é da forma: a D b D c D...D z onde cada string, a, 6, ..., z, é da forma da string definida no Exercício 11. (Por conseguinte, uma string estará no formato correto se consistir em qualquer número de strings desse tipo, separadas pelo caractere 'D'.) Em cada ponto, você só poderá ler o próximo caractere da string. 18. Elabore um algoritmo que sem usar uma EAD Pilha leia uma sequência de operações push e pop, e determine se está ocorrendo erro ou não nalguma operação pop. 19. Que conjunto de critérios é necessário e suficiente para que uma sequência de operações push e pop sobre uma única pilha (inicialmente vazia) deixe a pilha vazia sem provocar erro? Que conjunto de critérios é necessário para que essa sequência deixe uma pilha não vazia inalterada? 20. Implemente uma EAD Pilha qual cada item seja um número variável de inteiros. Escolha uma estrutura de dados em C para essa pilha e elabore as funções push e pop para ela. Programação III / Estruturas de Dados