Estruturas de Dados 2005/2006
1
Inversão de uma Sequência
Inverter uma sequência de caracteres a partir do stdin:
#include <stdio.h>
#include<stdlib.h>
#include "pilhas.h"
{*** interface para Pilhas ***}
. . .
{*** Inverter uma sequencia de caracteres ***}
void InvSeq()
{ char car;
Pilhadechar Pcar; // Pilha de caracteres
Pcar = criarP(); // cria uma nova Pilha
car = getchar();
while( (car != EOF) && (isalpha(car)) )
{
Pcar = sobrepoe(car, Pcar);
car = getchar();
}
while( !vaziaP(Pcar) )
{
car = topo(Pcar);
putchar(car);
Pcar = retira(Pcar);
}
}
Estruturas de Dados 2005/2006
2
Simulação iterativa de Cálculo Recorrente
“Desrecorrência” do cálculo recorrente: utilização de Pilha para simular as sucessivas
chamadas recorrentes
. . .
Pilhadeint Pint;
// Pilha de inteiros
. . .
// Calculo do valor do factorial de n>=0
Pint = criarP(); // cria uma nova Pilha de inteiros
Pint = sobrepoe(n, Pint);
while( n > 0 )
{
n--;
Pint = sobrepoe(n, Pint);
}
// n = 0, caso de paragem da recorrencia
Pint = retira(Pint);
// tirar o zero
factorial = 1;
while( !vaziaP(Pint) )
{
factorial = factorial * topo(Pint);
Pint = retira(Pint);
}
// factorial == n!
. . .
Estruturas de Dados 2005/2006
3
Concordância de Parêntisis
Dada uma expressão aritmética, verificar se os parêntisis estão equilibrados:
#define TRUE 1
#define FALSE 0
typedef int BOOL;
char
car;
Pilhadechar Pcar;
// Pilha de caracteres
. . .
//Cada ( e’ colocado na pilha; cada ) retira o par da pilha
Pcar = criarP(); // cria uma nova Pilha (vazia) de carateres
continua = TRUE;
while( continua )
{
car = getchar();
// ler o proximo caracter
switch(car)
{ case ’(’ : Pcar = sobrepoe(car, Pcar);
break;
case ’)’ : if(!vaziaP(Pcar)) Pcar = retira(Pcar);
else continua = FALSE; // erro: ( sem par a fechar
break;
case ’\n’: continua = FALSE; // acabou a expressao
Estruturas de Dados 2005/2006
4
fimdelinha = TRUE;
break;
}
//
//
//
//
}
Aqui: { pilha vazia OU fim de linha } ->
{ pilha vazia E fim de linha } OU { pilha vazia E NOT(fim de linha) }
OU { NOT(pilha vazia) E fim de linha }
=> { parentisis equilibrados } OU { parentisis ) a mais } OU { parentisis ( a mais }
if (vaziaP(Pcar) && fimdelinha)
. . .
// expressao correcta
else
. . .
// ERRO: Parentisis desiquilibrados
Estruturas de Dados 2005/2006
5
Verificar se uma palavra é um Palı́ndromo
. . .
Pilhadecar Pcar;
Filadecar Fcar;
// Pilha de caracteres
// Fila de caracteres
. . .
Pcar = criarP(); // cria uma Pilha vazia
Fcar = criarF(); // cria uma Fila vazia
while( !fimdelinha(stdin) )
{
car = getch(input);
Pcar = sobrepoe(car, Pcar);
Fcar = juntar(car, Fcar);
}
capicua = TRUE;
factorial = 1;
while( (!vaziaP(Pcar)) && (!vaziaF(Fcar)) && capicua )
{
if( topo(Pcar) == frente(Fcar) )
{
Pcar = retirar(Pcar);
Fcar = remover(Fcar);
} else capicua = FALSE;
}
. . .
Download

Invers˜ao de uma Sequência