*_*

sexta-feira, 15 de junho de 2012

Estrutura de Dados - Pilha Encadeada em Linguagem Pascal.

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;
    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;
Terá que mudar na passagem acrescentando duas novas variáveis e logo abaixo na atribuição.

Mostrar ficaria assim:
Procedure Mostrar(P:PilhaEnc);
Begin        
            Writeln; Writeln;
            Writeln('Codigo      : ',P^.elemento.codigo);                
            Writeln('Produto     : ',P^.elemento.produto);
            Writeln('Descricao   : ',P^.elemento.descricao);
            Writeln('Quantidade  : ',P^.elemento.qtd);
End;

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: ,

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