Achar Palindromes usando Pilha
Uma pilha é uma estrutura de dados cujas principais funções estão relacionadas a empilhar e desempilhar elementos. Um problema interessante que pode ser resolvido com pilha é a verificação de palíndromos. Um palídromo é uma palavra que sua leitura é a mesma independente se iniciamos na esquerda ou na direita. Um exemplo seria a palavra arara. Assim, a tarefa aqui é elabora um programa em pascal utilizando a estrutura de pilha para verificar se uma palavra é palíndromo ou não.
Abaixo segue um programa em Pascal para fazer isso:
Abaixo segue um programa em Pascal para fazer isso:
Caso queria baixar o fonte clique aqui.
program Expressao;
type
TipoChave = char;
TipoApontador = ^TipoCelula;
TipoItem = record
Chave: TipoChave;
{ outros componentes }
end;
TipoCelula = record
Item: TipoItem;
Prox: TipoApontador;
end;
TipoPilha = record
Fundo : TipoApontador;
Topo : TipoApontador;
Tamanho: integer;
end;
procedure FPVazia (var Pilha: TipoPilha);
begin
new (Pilha.Topo);
Pilha.Fundo := Pilha.Topo;
Pilha.Topo^.Prox := nil;
Pilha.Tamanho := 0;
end; { FPVazia }
function Vazia (Pilha: TipoPilha): boolean;
begin
Vazia := Pilha.Topo = Pilha.Fundo;
end; { Vazia }
procedure Empilha (x: TipoItem; var Pilha: TipoPilha);
var Aux: TipoApontador;
begin
new (Aux);
Pilha.Topo^.Item := x;
Aux^.Prox := Pilha.Topo;
Pilha.Topo := Aux;
Pilha.Tamanho := Pilha.Tamanho + 1;
end; { Empilha }
procedure Desempilha (var Pilha: TipoPilha; var Item: TipoItem);
var q: TipoApontador;
begin
if Vazia (Pilha)
then writeln ('Erro: lista vazia')
else begin
q := Pilha.Topo;
Pilha.Topo := q^.Prox;
Item := q^.Prox^.Item;
dispose (q);
Pilha.Tamanho := Pilha.Tamanho - 1;
end;
end; { Desempilha }
function Tamanho (Pilha: TipoPilha): integer;
begin
Tamanho := Pilha.Tamanho;
end; { Tamanho }
var
pilha: TipoPilha;
item : TipoItem;
aux : string;
i : integer;
palindrome : boolean;
begin
FPVazia (pilha);
writeln('Digite a palavra');
readln(aux);
i:=1;
while i<>length(aux) +1 do
begin
item.Chave := aux[i];
Empilha (item, pilha);
i:= i+1;
end;
palindrome:=true;
for i := 1 to length(aux) do
begin
Desempilha (pilha, item);
writeln ('Desempilhou: ', item.Chave);
writeln(aux[i]);
if item.Chave<>aux[i] then
begin
palindrome:=false;
break;
end
end;
if palindrome=true then
writeln('A palavra é palíndrome')
else writeln('A palavra não é palíndrome');
end. { Pilha }
Comentários