Exercícios II (Pilhas)
Contato
- Jean Paulo Martins (jeanmartins utfpr edu br)
- Sala 105, Bloco S (UTFPR - Campus Pato Branco)
Conteúdo
Exercícios
Validação parentética
Agora que defimos uma pilha e indicamos as operações que podem ser executadas sobre ela, vejamos como podemos usar a pilha na solução de problemas. Examine uma expressão matemática que inclui vários conjuntos de parênteses agrupados. Por exemplo:
Queremos garantir que os parênteses estejam corretamente agrupados, ou seja, desejamos verificar se:
- Existe um número igual de parênteses esquerdos e direitos.
- Todo parêntese da direita está precedido por um parêntese da esquerda.
#include "stack.h"
// Funções auxiliares para identificar o caractere sendo lido.
// [!] É necessário implementá-las para que o exemplo funcione.
bool abreEscopo(char c);
bool fechaEscopo(char c);
bool escopoCorreto(char a, char b);
int verificaExpressao(const char* expressao, int esize) {
stack* p = new_stack();
for (int i = 0; i < esize; ++i) {
char atual = expressao[i];
if ( abreEscopo(atual) ) {
stack_push(p, atual);
} else if ( fechaEscopo(atual) ) {
if (stack_empty(p)) return i;
if ( !escopoCorreto(stack_pop(p), atual) ) return i;
}
}
if (!stack_empty(p)) return esize;
free_stack(p);
return esize+1;
}
Validação de expressões
Adapte o código do validador para que funcione com expressões mais complexas, contendo os demais delimitadores
Verificação de palíndromo
Escreva um algoritmo para determinar se uma string de caracteres de entrada é da forma:
onde são strings e é o inverso de . O caractere delimita o fim de . Somente um caractere da string pode ser lido de cada vez.
Verificar concatenação de palíndromos
Escreva um algoritmo para determinar se uma string de caracteres de entrada é da forma:
onde cada string , é da forma da string definida no exercício anterior, isto é,
Underflow
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 e não provoque underflow?