Código para calcular expressão pós pilha encadeada. [RESOLVIDO]

1. Código para calcular expressão pós pilha encadeada. [RESOLVIDO]

Douglas
copynow

(usa Slackware)

Enviado em 03/03/2011 - 06:57h

Bom dia,
Fiz o template de pilha encadeada certo.
Agora eu precisava do main..

Por exemplo:
Leia um número ou um operador
Se for número, empilhe
Se for operador, desempilhe os últimos 2 números, realize a operação
correspondente e empilhe o resultado

Minha dificuldade é implementar isso no c++

Os templates abaixo no pilhaEnc.h:

#ifndef _PilhaEnc_H
#define _PilhaEnc_H
#include <stdexcept>
using std::logic_error;

namespace ED {
template <typename Tipo>
class PilhaEnc {
public:
PilhaEnc();
~PilhaEnc();

// Métodos principais
void empilha(const Tipo &elem) throw (logic_error);
Tipo desempilha() throw (logic_error);
// Métodos auxiliares
bool vazia();
int tamanho();
private:
struct Celula {
Tipo el;
Celula *prox;
};

Celula *topo;
int nelem;
};

// Construtor
template <typename Tipo>
PilhaEnc<Tipo>::PilhaEnc() {
topo = NULL;
nelem = 0;
}

// Destrutor
template <typename Tipo>
PilhaEnc<Tipo>::~PilhaEnc() {
Celula *aux;
while (topo) {
aux = topo;
topo = topo->prox;
delete aux;
}
}

// Empilha
template <typename Tipo>
void PilhaEnc<Tipo>::empilha(const Tipo &el) throw (logic_error){
Celula *nova = new Celula;
if (nova == NULL) throw logic_error("Falta memoria\n");
nova->el = el;
nova->prox = topo;
topo = nova;
nelem++;
}

// Desempilha
template <typename Tipo>
Tipo PilhaEnc<Tipo>::desempilha() throw (logic_error) {
if (nelem == 0) throw logic_error("Pilha vazia\n");
Tipo ret = topo->el;
Celula *aux = topo;
topo = topo->prox;
delete aux;
nelem--;
return(ret);
}

// Métodos auxiliares
template <typename Tipo>
bool PilhaEnc<Tipo>::vazia() {
return(nelem == 0);
}
template <typename Tipo>
int PilhaEnc<Tipo>::tamanho() {
return(nelem);
}
}
#endif





  


2. Notação polonesa reversa

Júlio Hoffimann Mendes
julio_hoffimann

(usa Ubuntu)

Enviado em 03/03/2011 - 09:08h

Oi Douglas,

Esse é um problema clássico que tem diversas soluções. Uma delas é como você está fazendo, usando pilhas.

Primeiro perceba que o exercício parte do pressuposto que você tem uma expressão em notação polonesa reversa. Essa notação não necessita parênteses e a implementação fica bem mais fácil.

Sua classe aparenta estar ok e você tem o algoritmo correto, então qual é o problema?

Abraço!

P.S.: Não crie dois tópicos sobre o mesmo assunto. Se puder deletar o outro, a comunidade agradece.


3. é fazer o main

Douglas
copynow

(usa Slackware)

Enviado em 03/03/2011 - 09:52h

Eu tenho dificuldades com c++, não consigo pensar no main... eu entendo pilhas e tal, mas na hora de fazer a interface funcionar não vai.



4. Foi você mesmo quem implementou a pilha?

Júlio Hoffimann Mendes
julio_hoffimann

(usa Ubuntu)

Enviado em 03/03/2011 - 12:07h

Douglas,

Se você realmente implementou a classe acima, não deveria ter dificuldades em implementar a main().

Posso ajudar nas dúvidas que surgirem, mas não vou fazer o programa.


5. Sim, fica dando esses erros é em c++

Douglas
copynow

(usa Slackware)

Enviado em 21/03/2011 - 23:38h

C:\Users\doug\Desktop\exercicios_ed\calc_pos_encadeada\calc_pos_encadeada.c|1|error: iostream: No such file or directory|
C:\Users\doug\Desktop\exercicios_ed\calc_pos_encadeada\PilhaEnc.h|3|error: exception: No such file or directory|
C:\Users\doug\Desktop\exercicios_ed\calc_pos_encadeada\PilhaEnc.h|5|error: expected '=', ',', ';', 'asm' or '__attribute__' before 'namespace'|
C:\Users\doug\Desktop\exercicios_ed\calc_pos_encadeada\PilhaEnc.h|6|error: expected '=', ',', ';', 'asm' or '__attribute__' before 'std'|
C:\Users\doug\Desktop\exercicios_ed\calc_pos_encadeada\PilhaEnc.h|9|error: expected '=', ',', ';', 'asm' or '__attribute__' before 'ED'|
C:\Users\doug\Desktop\exercicios_ed\calc_pos_encadeada\calc_pos_encadeada.c|7|error: expected '=', ',', ';', 'asm' or '__attribute__' before 'namespace'|
C:\Users\doug\Desktop\exercicios_ed\calc_pos_encadeada\calc_pos_encadeada.c|9|error: expected '=', ',', ';', 'asm' or '__attribute__' before 'ED'|
C:\Users\doug\Desktop\exercicios_ed\calc_pos_encadeada\calc_pos_encadeada.c||In function 'main':|
C:\Users\doug\Desktop\exercicios_ed\calc_pos_encadeada\calc_pos_encadeada.c|13|error: 'PilhaEnc' undeclared (first use in this function)|
C:\Users\doug\Desktop\exercicios_ed\calc_pos_encadeada\calc_pos_encadeada.c|13|error: (Each undeclared identifier is reported only once|
C:\Users\doug\Desktop\exercicios_ed\calc_pos_encadeada\calc_pos_encadeada.c|13|error: for each function it appears in.)|
C:\Users\doug\Desktop\exercicios_ed\calc_pos_encadeada\calc_pos_encadeada.c|13|error: expected expression before 'float'|
C:\Users\doug\Desktop\exercicios_ed\calc_pos_encadeada\calc_pos_encadeada.c|18|error: 'cout' undeclared (first use in this function)|
C:\Users\doug\Desktop\exercicios_ed\calc_pos_encadeada\calc_pos_encadeada.c|18|error: 'endl' undeclared (first use in this function)|
C:\Users\doug\Desktop\exercicios_ed\calc_pos_encadeada\calc_pos_encadeada.c|21|error: 'try' undeclared (first use in this function)|
C:\Users\doug\Desktop\exercicios_ed\calc_pos_encadeada\calc_pos_encadeada.c|21|error: expected ';' before '{' token|
||=== Build finished: 15 errors, 0 warnings ===|






O Código está assim:

#include <iostream>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include "PilhaEnc.h"

using namespace std;

using ED::PilhaEnc;

int main(int argc, char ** argv)
{
PilhaEnc<float> Pilha;
float num1, num2, res;
int i;
char valor[10];

cout<< "Calculadora Pos-Fixada(Pilha Encadeada)"<< endl;
cout << "Entre com um valor, ou um operador, entre com 'r' ou 'R' para sair, ou ver o resultado" <<endl;

try{
do
{

cin >> valor;
i = 0;
if(valor[i] != 'r' && valor[i])


if (valor[i] != '+' && valor[i] != '-' && valor[i] != '*' && valor[i] != '/')
{
Pilha.empilha(atof(valor));

}
else
{
num1 = Pilha.desempilha();
num2 = Pilha.desempilha();

if (valor[i] == '+')
{
res = num1 + num2;
Pilha.empilha(res);
}
else
{
if (valor[i] == '-')
{
res = num1 - num2;
Pilha.empilha(res);
}
else
{
if (valor[i] == '*')
{
res = num1*num2;
Pilha.empilha(res);
}
else
{
if (valor[i] == '/')
{
res = num1 / num2;
Pilha.empilha(res);
}
else
{
cout<< "Entre com um operador valido +, -, *, ou /"<<endl;
return 0;
}
}
}
}
}
}while (valor[i] != 'r'&& valor[i] != 'R');
res = Pilha.desempilha();
cout<< res ;
}
catch(std::exception& err)
{
cout << err.what();
}
}


To usando o CodeBlocks


6. Falta de bom senso

Júlio Hoffimann Mendes
julio_hoffimann

(usa Ubuntu)

Enviado em 22/03/2011 - 20:45h

Douglas,

Primeiro você me manda um email privado dizendo que o código não foi você quem fez, que conseguiu com alguém.

Depois você retorna com um erro de compilação no Windows.

Sinceramente, você acha que eu vou perder meu tempo com alguém que não é sincero nem consigo mesmo?

Faça-me o favor.


7. orbigado

Douglas
copynow

(usa Slackware)

Enviado em 22/03/2011 - 21:56h

obrigado!
Desculpe, você não entendeu o que eu quis dizer. Eu não me lembro de ter enviado email privado enfim. Resolvido!








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts