Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Francisco Jr.

Manipulação de uma pilha

Recommended Posts

1) A tabela abaixo mostra as operações para a manipulação de uma pilha. (1,0)

 

PUSH: coloca um elemento novo na pilha.

POP: Retira o elemento do topo da pilha.

Operação Unária: Efetua a operação sobre o elemento do topo da pilha e substitui o elemento do topo pelo resultado.
operações disponíveis: DEC (subtrai o valor 1 do elemento).

Operação binária: Efetua a operação sobre os 2 elementos do topo da pilha, retira os dois elementos do topo da pilha e coloca o resultado da operação no topo da pilha. Operações disponíveis: ADD (adição -> X+Y), SUB (subtração-> Y-X), MPY (multiplicação -> X*Y) e DIV (divisão -> X/Y), onde Y é o elemento no topo da pilha e X o elemento abaixo do Y.

 

 

Utilizando as definições acima, a sequência de instruções a seguir foi implementada para avaliar o resultado de uma expressão, sendo A, B, C, D e E os operandos desta expressão. O resultado da avaliação é acumulado em F.

 

PUSH A

PUSH B

SUB

PUSH C

PUSH D

PUSH E

MPY

ADD

DEC

DIV

POP F

 

Com base no que foi exposto acima, se A, B, C, D e E apresentarem, respectivamente, os valores 9, 3, 2, 1 e 1, qual o valor armazenado em F após a execução da instrução POP F? A resposta é 3.

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

#define A 9
#define B 3
#define C 2
#define D 1
#define E 1

typedef struct 
{
	int valor[6];
	int iIndice;

}pilha;

void Inicializa(pilha *pPilha)
{
	memset(pPilha,0,sizeof(pilha));
	pPilha->iIndice = -1;
}

int EhVazia(pilha *pPilha)
{
	return (pPilha->iIndice < 0) ? 1 : 0;
}

int SUB(int a, int b)
{
	int sub;
	sub = b - a;

	return sub;
}

int MPY(int a, int b)
{
	int mult;
	mult = a * b;

	return mult;
}

void push(pilha *pPilha, int sInsere)
{
	pPilha->iIndice++;
	pPilha->valor[pPilha->iIndice] = sInsere;
}

int top(pilha *pPilha)
{
	return pPilha->valor[pPilha->iIndice];
}

int pop(pilha *pPilha)
{
	int retValor;
	
	retValor = pPilha->valor[pPilha->iIndice];
	pPilha->iIndice--;
	
	return retValor;
}

int main()
{
	pilha pValor;
	int x, y, F;
	
	Inicializa(&pValor);

	push(&pValor, A);
	push(&pValor, B);
	
	x = pValor.valor[pValor.iIndice];
	y = pValor.valor[pValor.iIndice - 1];
	
	pop(&pValor);
	pop(&pValor);
	push(&pValor, SUB(x, y)); 
	push(&pValor, C);
	push(&pValor, D);
	push(&pValor, E);
	x = pValor.valor[pValor.iIndice];
	y = pValor.valor[pValor.iIndice - 1];
	pop(&pValor);
	pop(&pValor);
	push(&pValor, MPY(x, y));
	
	getchar();
}

Como podem ver estou repetindo a chamada para as variáveis x e y.
Não consegui terminar essa implementação.
Agradeço toda a ajuda

Compartilhar este post


Link para o post
Compartilhar em outros sites

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

#define A 9
#define B 3
#define C 2
#define D 1
#define E 1

typedef struct 
{
	int valor[6];
	int iIndice;

}pilha;

void Inicializa(pilha *pPilha)
{
	memset(pPilha,0,sizeof(pilha));
	pPilha->iIndice = -1;
}

int EhVazia(pilha *pPilha)
{
	return (pPilha->iIndice < 0) ? 1 : 0;
}

int SUB(int a, int b)
{
	int resultado;
	resultado = b - a;

	return resultado;
}

int MPY(int a, int b)
{
	int resultado;
	resultado = a * b;

	return resultado;
}

int DIV(int a, int b)
{
	int resultado;
	resultado =  b / a;

	return resultado;
}

int ADD(int a, int b)
{
	int resultado;
	resultado = a + b;

	return resultado;
}

int DEC(int a)
{
	return --a;
}

void push(pilha *pPilha, int sInsere)
{
	pPilha->iIndice++;
	pPilha->valor[pPilha->iIndice] = sInsere;
}

int top(pilha *pPilha)
{
	return pPilha->valor[pPilha->iIndice];
}

int pop(pilha *pPilha)
{
	int retValor;
	
	retValor = pPilha->valor[pPilha->iIndice];
	pPilha->iIndice--;
	
	return retValor;
}

int main()
{
	pilha pValor;
	int x, y;
	
	Inicializa(&pValor);

	push(&pValor, A);
	push(&pValor, B);	
	x = pop(&pValor);
	y = pop(&pValor);
	push(&pValor, SUB(x, y));
	
	push(&pValor, C);
	push(&pValor, D);
	push(&pValor, E);	
	x = pop(&pValor);
	y = pop(&pValor);	
	push(&pValor, MPY(x, y));

	x = pop(&pValor);
	y = pop(&pValor);
	push(&pValor, ADD(x, y));
	
	push(&pValor, DEC(pop(&pValor)));
	
	x = pop(&pValor);
	y = pop(&pValor);
	push(&pValor, DIV(x, y));
	
	printf("%d\n",pop(&pValor));
	
	getchar();
}

Consegui implementar as outras funções: Multiplicação, Divisão, etc..

O problema agora, apesar de parecer simples, é imprimir na tela os valores que estão na pilha.

Ou seja, após cada operação mostrar quais os valores que estão na pilha.

Só consegui mostrar o valor final, tentei utilizar para mostrar os valores na pilha, mas não consegui o resultado esperado.

Se alguém puder me ajudar nessa parte eu agradeço desde já.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A operação de impressão de todos os valores não faz parte do tipo abstrato definido no seu exercício. Você tem tudo de que precisa, pois a implementação não é transparente (ou seja, seu mecanismo está exposto).

 

Sugiro criar uma rotina que percorra o vetor de valores da pilha, de 0 até iIndice, imprimindo cada um.

 

Se quiser melhorar seu programa, sugiro também:

 

1. Considerar casos de underflow e overflow

2. Criar uma rotina de "operação". Aqui, há duas opções:

2.1. Criar rotinas separadas, uma para cada aridade (então você teria uma para operações unárias e outra para binárias, e assim por diante)

2.2. Criar uma rotina mais genérica, que receba como parâmetro, além dos operandos e da operação, a aridade em si (e assim ela saberá quantos operandos ler)

3. Criar um loop de leitura, cálcuo e impressão (REPL - read, evaluate, print loop).

 

 

Segue a minha implementação deste tipo de calculadora em C:

https://gist.github.com/guipn/5122682

 

Também escrevi versões em outras linguagens:

https://gist.github.com/guipn/58bc57ba5fb161c9e58a (JS)

https://gist.github.com/guipn/5989678 (Haskell)

 

abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Enfim consegui!
Guidjos muito obrigado pela ajuda!!!!!!

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

#define A 9
#define B 3
#define C 2
#define D 1
#define E 1

typedef struct 
{
	int valor[6];
	int iIndice;

}pilha;

void Inicializa(pilha *pPilha)
{
	memset(pPilha,0,sizeof(pilha));
	pPilha->iIndice = -1;
}

int EhVazia(pilha *pPilha)
{
	return (pPilha->iIndice < 0) ? 1 : 0;
}

int SUB(int a, int b)
{
	int resultado;
	resultado = b - a;

	return resultado;
}

int MPY(int a, int b)
{
	int resultado;
	resultado = a * b;

	return resultado;
}

int DIV(int a, int b)
{
	int resultado;
	resultado =  b / a;

	return resultado;
}

int ADD(int a, int b)
{
	int resultado;
	resultado = a + b;

	return resultado;
}

int DEC(int a)
{
	return --a;
}

void push(pilha *pPilha, int sInsere)
{
	pPilha->iIndice++;
	pPilha->valor[pPilha->iIndice] = sInsere;
}

int top(pilha *pPilha)
{
	return pPilha->valor[pPilha->iIndice];
}

int pop(pilha *pPilha)
{
	int retValor;
	
	retValor = pPilha->valor[pPilha->iIndice];
	pPilha->iIndice--;
	
	return retValor;
}

int main()
{
	pilha pValor;
	int x, y;
	
	Inicializa(&pValor);

	push(&pValor, A);
	push(&pValor, B);	
	x = pop(&pValor);
	y = pop(&pValor);
	push(&pValor, SUB(x, y));
	
	push(&pValor, C);
	push(&pValor, D);
	push(&pValor, E);	
	x = pop(&pValor);
	y = pop(&pValor);	
	push(&pValor, MPY(x, y));

	x = pop(&pValor);
	y = pop(&pValor);
	push(&pValor, ADD(x, y));
	
	push(&pValor, DEC(pop(&pValor)));
	
	x = pop(&pValor);
	y = pop(&pValor);
	push(&pValor, DIV(x, y));
	
	printf("%d\n",pop(&pValor));
	
	getchar();
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.