Quantidade de parênteses iguais usando pilha
Dado uma equação matemática qualquer, tal como, ((x+y)*z) identifique se o conjuto de parênteses a esquerda apresenta complemento a direita. Em caso afirmativo apresentar como resultado "equação correta". Caso contrário, "operação inválida, erro na composição dos parênteses.
A solução encontra-se abaixo:
Caso queria baixar os fontes 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, pilha2: TipoPilha;
item : TipoItem;
aux : string;
i : integer;
begin
FPVazia (pilha);
FPVazia (pilha2);
writeln('Digite a expressão');
readln(aux);
i:=1;
while i<>length(aux) +1 do
begin
if aux[i]='(' then
begin
item.Chave := aux[i];
Empilha (item, pilha);
end
else if aux[i]=')'then
begin
item.Chave := aux[i];
Empilha (item, pilha2);
end;
i:=i+1;
end;
writeln ('Tamanho da pilha: ', Tamanho (Pilha));
writeln ('Tamanho da pilha 2: ', Tamanho (Pilha2));
if Tamanho(pilha)=Tamanho(pilha2) then
writeln('Expressão correta')
else writeln('operação inválida, erro na composição dos parênteses');
end. { Pilha }
Comentários