Essa é uma atividade em aula que fizemos com nosso professor '-' como o dele ficou melhor que o meu... vou postar o dele, por que o meu ficou menos organizado (pra mim só importa que funcione o resto é frescura).
Vamos lá, primeiramente isso é um exemplo de pilha em c/c++, mas o que seria uma calculadora pós fixa ? eu também não sabia até ele me ensinar.
Imagine uma calculadora normal, alias como nos humanos calculamos e colo programamos as maquinas ou linguagens para calcular... primeiro temos um numero depois um sinal e outro numero: 3 + 2.
Ele pega o numero, depois vê qual operação matemática vai realizar, no caso soma, agora faz a ele ve o próximo numero que vai fazer a operação no primeiro, ou seja, pega o 2 e soma ao 3, pode não fazer diferença na soma a ordem que isso ocorre, mas imagine a divisão...
10 / 2 , se pegar o inverso 10 e o mesmo dividir o 2, vai dar 0,2, mas se 2 dividir o 10, fica 5, que seria o correto para nós...
Em resumo '-' o numero a direita aplica a operação no numero da esquerda...
Mas no caso da pós fixa, temos isso: 2 3 +
pegamos o primeiro numero, joga na pilha, pegamos o segundo e jogamos na pilha, achamos um operador, desempilha o primeiro e com ele fará a operação no primeiro que tambem será desempilhado, faz a conta e coloca na pilha. ou seja:
2 3 +
5
Agora mais complexo 2 3 4 + + 3 7 * -
o 3 e 4 soma.
2 7 + 3 7 * -
2 e 7 soma
9 3 7 * -
3 e 7 multiplica
9 21 -
21 diminui o 9
-12
fim... nesse caso não estamos respeitando prioridade de sinais mas é pra entendimento.
>>>>>>>>>>>>>>>>>>>>>>>>>>Arquivo pilha.h
#ifndef PILHA_H_INCLUDED
#define PILHA_H_INCLUDED
#define MAX_PILHA 1000
typedef struct Pilha{
int vet[MAX_PILHA];
int topo;
}Pilha;
void init(Pilha *P);
void push(Pilha *P, int N);
int pop(Pilha *P);
int peek(Pilha *P);
bool full(Pilha *P);
bool empty(Pilha *P);
#endif // PILHA_H_INCLUDED
>>>>>>>>>>>>>>>>>>>>>>>>>>Arquivo pilha.cpp
#include "pilha.h"
void init(Pilha *P){
P->topo = -1;
}
void push(Pilha *P, int N){
if(P->topo != MAX_PILHA - 1)
P->vet[++(P->topo)]=N;
}
int pop(Pilha *P){
if(P->topo!=-1)
return P->vet[P->topo--];
return 0;
}
int peek(Pilha *P){
if(P->topo!=-1)
return P->vet[P->topo];
return 0;
}
bool full(Pilha *P){
return P->topo == MAX_PILHA -1;
}
bool empty(Pilha *P){
return P->topo == -1;
}
>>>>>>>>>>>>>>>>>>>>>>>>>>Arquivo main.cpp
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "pilha.h"
using namespace std;
int main(){
Pilha P;
char expressao[100];
init(&P);
scanf(" %s", expressao);
for(int i=0;i<strlen(expressao); i++){
if(expressao[i]>='0'&&expressao[i]<='9')
push(&P, expressao[i]-'0');
else
switch(expressao[i]){
case'+': push(&P, pop(&P) + pop(&P)); break;
case'-': push(&P, pop(&P) - pop(&P)); break;
case'*': push(&P, pop(&P) * pop(&P)); break;
case'/': push(&P, pop(&P) / pop(&P)); break;
}
}
printf("%d\n", peek(&P));
return 0;
}
================================================== =====
Não lembro se tinha algum erro pois lembro que eu tinha editado algo antes de salvar...
Mas se tiver me avisa que ajeito.
Vamos lá, primeiramente isso é um exemplo de pilha em c/c++, mas o que seria uma calculadora pós fixa ? eu também não sabia até ele me ensinar.
Imagine uma calculadora normal, alias como nos humanos calculamos e colo programamos as maquinas ou linguagens para calcular... primeiro temos um numero depois um sinal e outro numero: 3 + 2.
Ele pega o numero, depois vê qual operação matemática vai realizar, no caso soma, agora faz a ele ve o próximo numero que vai fazer a operação no primeiro, ou seja, pega o 2 e soma ao 3, pode não fazer diferença na soma a ordem que isso ocorre, mas imagine a divisão...
10 / 2 , se pegar o inverso 10 e o mesmo dividir o 2, vai dar 0,2, mas se 2 dividir o 10, fica 5, que seria o correto para nós...
Em resumo '-' o numero a direita aplica a operação no numero da esquerda...
Mas no caso da pós fixa, temos isso: 2 3 +
pegamos o primeiro numero, joga na pilha, pegamos o segundo e jogamos na pilha, achamos um operador, desempilha o primeiro e com ele fará a operação no primeiro que tambem será desempilhado, faz a conta e coloca na pilha. ou seja:
2 3 +
5
Agora mais complexo 2 3 4 + + 3 7 * -
o 3 e 4 soma.
2 7 + 3 7 * -
2 e 7 soma
9 3 7 * -
3 e 7 multiplica
9 21 -
21 diminui o 9
-12
fim... nesse caso não estamos respeitando prioridade de sinais mas é pra entendimento.
>>>>>>>>>>>>>>>>>>>>>>>>>>Arquivo pilha.h
#ifndef PILHA_H_INCLUDED
#define PILHA_H_INCLUDED
#define MAX_PILHA 1000
typedef struct Pilha{
int vet[MAX_PILHA];
int topo;
}Pilha;
void init(Pilha *P);
void push(Pilha *P, int N);
int pop(Pilha *P);
int peek(Pilha *P);
bool full(Pilha *P);
bool empty(Pilha *P);
#endif // PILHA_H_INCLUDED
>>>>>>>>>>>>>>>>>>>>>>>>>>Arquivo pilha.cpp
#include "pilha.h"
void init(Pilha *P){
P->topo = -1;
}
void push(Pilha *P, int N){
if(P->topo != MAX_PILHA - 1)
P->vet[++(P->topo)]=N;
}
int pop(Pilha *P){
if(P->topo!=-1)
return P->vet[P->topo--];
return 0;
}
int peek(Pilha *P){
if(P->topo!=-1)
return P->vet[P->topo];
return 0;
}
bool full(Pilha *P){
return P->topo == MAX_PILHA -1;
}
bool empty(Pilha *P){
return P->topo == -1;
}
>>>>>>>>>>>>>>>>>>>>>>>>>>Arquivo main.cpp
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "pilha.h"
using namespace std;
int main(){
Pilha P;
char expressao[100];
init(&P);
scanf(" %s", expressao);
for(int i=0;i<strlen(expressao); i++){
if(expressao[i]>='0'&&expressao[i]<='9')
push(&P, expressao[i]-'0');
else
switch(expressao[i]){
case'+': push(&P, pop(&P) + pop(&P)); break;
case'-': push(&P, pop(&P) - pop(&P)); break;
case'*': push(&P, pop(&P) * pop(&P)); break;
case'/': push(&P, pop(&P) / pop(&P)); break;
}
}
printf("%d\n", peek(&P));
return 0;
}
================================================== =====
Não lembro se tinha algum erro pois lembro que eu tinha editado algo antes de salvar...
Mas se tiver me avisa que ajeito.