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:

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