Aqui temos um exemplo de uma Pilha Encadeada escrita em Linguagem de Programação Pascal.
Inicio
Program Pilha; uses crt; Type dados=record produto:string; codigo:integer; End; PilhaEnc=^NO; NO=record elemento:dados; ant:PilhaEnc; End; { Variável "P" aponta para o Topo da Pilha } Procedure init (var P:PilhaEnc); Begin P:=nil; End; Function Vazia(P:PilhaEnc):boolean; Begin if P=nil then Vazia:=true else Vazia:=false; End; Procedure Push(var P:PilhaEnc; _produto:string; _codigo:integer); var P1:PilhaEnc; Begin new(P1); P1^.elemento.produto:= _produto; P1^.elemento.codigo:= _codigo; if Vazia(P) then Begin P1^.ant:=nil; P:=P1; End else Begin P1^.ant:=P; P:=P1; End; End; Procedure Mostrar(P:PilhaEnc); Begin Writeln; Writeln; Writeln('Codigo : ',P^.elemento.codigo); Writeln('Produto : ',P^.elemento.produto); End; Procedure Top (P: PilhaEnc); begin if not Vazia(P) then Mostrar(P) else Writeln(' Pilha Vazia'); End; Procedure Pop(var P:PilhaEnc); var Pilha_aux:PilhaEnc; Begin if not Vazia(P) then Begin Pilha_aux:=P; //Variavel Auxiliar para guardar o Topo da Pilha que é "P" Mostrar(Pilha_aux); P:=P^.ant; dispose(Pilha_aux); End else Writeln(' Pilha Vazia'); End; Procedure Menu; Begin Writeln; Writeln('-------------------'); Writeln('--| 1 Push |--'); Writeln('--| 2 Top |--'); Writeln('--| 3 Pop |--'); Writeln('--| 0 Sair |--'); Writeln('-------------------'); End; VAR PE:PilhaEnc; op:integer; produto:string; { Variaveis } //usadas apenas para inserir na Pilha. codigo:integer; { do Push } BEGIN init(PE); repeat Menu; Write('Opcao: '); readln(op); case op of 1: Begin Writeln; Writeln; Write('Informe Codigo: '); readln(codigo); Write('Nome do Produto: '); readln(produto); Push(PE,produto,codigo); End; 2: Begin Writeln;Writeln; Writeln(' TOP'); Top(PE); End; 3: Begin Writeln;Writeln; Writeln(' POP'); Pop(PE); End; End; readln; clrscr; until(op=0); END.FIM!
Nessa Pilha foi criado um procedimento para mostrar o valor assim vai diminuindo a redundância de código. Para implementar pode ser feito da seguinte forma acrescentando variáveis:
Antes
Type dados=record produto:string; codigo:integer; End;Depois
Type dados=record produto:string; codigo:integer;
descricao:string;qtd:integer;
End;
Terá que modificar no Procedimento Push e Mostrar:Push ficaria assim:
Procedure Push(var P:PilhaEnc; _produto:string; _codigo:integer;_descricao:string; _qtd:integer);
var P1:PilhaEnc; Begin new(P1); P1^.elemento.produto:= _produto; P1^.elemento.codigo:= _codigo;
Terá que mudar na passagem acrescentando duas novas variáveis e logo abaixo na atribuição.P1^.elemento.descricao:= _descricao;P1^.elemento.qtd:= _qtd;if Vazia(P) then Begin P1^.ant:=nil; P:=P1; End else Begin P1^.ant:=P; P:=P1; End; End;
Mostrar ficaria assim:
Procedure Mostrar(P:PilhaEnc); Begin Writeln; Writeln; Writeln('Codigo : ',P^.elemento.codigo); Writeln('Produto : ',P^.elemento.produto);
End;Writeln('Descricao : ',P^.elemento.descricao);Writeln('Quantidade : ',P^.elemento.qtd);
Depois disso basta criar as variáveis globais qtd e descricao lá em variáveis do Push(onde tem o comentário), e pedir para informar, depois acrescentar na passagem do Procedimento Push. Ex.:
Push(PE,produto,codigo,descricao,qtd);
Pilha Encadeada em Pascal
Categories:
Pascal
,
Programação
2 comentários:
Muito bom esse código. Dá uma olhadinha nesse que fiz é interessante tbm.
Program palindroma;
const max = 100;
type Pilha = record
dados : array[1..max] of string;
topo : integer;
end;
procedure criarPilha(var P : Pilha); // Criação da pilha
begin
P.topo := 0;
writeln;
writeln(' =============== Pilha inicializada! ==================');
end;
function vazia(P : Pilha) : boolean;
begin
vazia := P.topo = 0; // Verifica se a pilha está vazia
end;
function cheia(P : Pilha) : boolean;
begin
cheia := P.topo = max; // Verifica se a pilha está cheia
end;
procedure push(var P : Pilha; n: string); // *PUSH* serve para inseriri um elemento na PILHA.
begin
if cheia(P) then
begin
writeln('OVERFLOW!!!'); // Estouro de Pilha, se ela estiver cheia.
end
else
begin
P.topo := P.topo + 1; // No começo o topo é 0 então fica 1!
P.dados[P.topo] := n; // Só pode ser inserido no topo da Lista e o topo sempre será P.topo!
end;
end;
function pop(var P : Pilha): string; // *POP* serve para remover um elemento! Não é uma palavra reservada, mas é uma comando de remoção.
begin
if vazia(P) then
begin
pop := 'UNDERFLOW'
end
else
begin
pop := P.dados[P.topo];
P.topo := (p.topo - 1);
end;
end;
function top(var P : Pilha): string; // *TOP* serve para mostrar uma cópia do elemento do topoda Pilha.
begin
if vazia(P) then
begin
top := 'PILHA VAZIA'
end
else
begin
top := P.dados[P.topo];
end;
end;
var
nome,v,s: string; // Nomes
P1 : Pilha;
c,i:integer; // Contadores....
begin
clrscr;
write('Digite uma palavra: ');
textcolor(white);
read(nome);
nome := upcase(nome);
i := length(nome);
for c:=1 to i do
begin
s := nome[c]; // Guarda cada letra para ser empilhada!
push(P1,s); // Enpilha uma letra por vez!
v:='';
end;
while not vazia(P1) do
v := v + (pop(p1)); // Recebe cada caractere que foi desemplilhado e soma;
(* ARARA => A + R + A + R + A*)
If (v = nome) then
begin
gotoxy(04,04);
writeln(' ',v,' = ',nome,' é palíndroma')
end
else
begin
gotoxy(04,04);
writeln(' ',v,' <> ',nome,' não é palíndroma');
end;
end.
eu vi pelo facebook, muito legal.
https://www.facebook.com/groups/languagepascal/452169148191882/
Postar um comentário