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

Postagens mais visitadas deste blog

Jogo 21 em C

Achar Palindromes usando Pilha