Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

Calculadora posfixa - Pilha

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    C / C++ Calculadora posfixa - Pilha

    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.





    Prove-me que és hacker... hacker que é hacker usa esta fan bar:
X
Working...
X