root/doc/postfix.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. push
  2. pop
  3. mostra
  4. preced
  5. main

// Pilha e algoritmo shunting yard (baseado no wikipedia) 

// Free for use. Done by Luiz Roberto Meier , 2010


#include "includes.hpp"

//#include <string.h>

//#include <stdio.h>

#define size 10

char pilha[size]; // tamanho da pilha 10 

int tos=0, ele; // posi��o e elemento


void push();
char pop();
void mostra();
int isempty();
int isfull();

char infix[30],output[30]; // limite pode ser aumentado...

int preced(char);

// Fun��es para operar com pilha (baseado no assembly)

void push(int ele) {
        pilha[tos]=ele;
        tos++;
}

char pop() {
        tos--;
        return(pilha[tos]);
}

void mostra() {
        int x=tos;      
        printf("\n Elementos da pilha: ");
        while(x!=0)
        printf("%c, ",pilha[--x]);      
}

// Fun��es para definir a preced�ncia

int preced(char simb) {
    if (simb== '(') return 0;
    if (simb== ')') return 0;
    if (simb=='+' || simb=='-') return 1;
    if (simb=='*' || simb=='/') return 2;
    if (simb=='^') return 3;
    return 0;
}

int main()
{
        int i=0,j=0,k=0,length;
        char temp;
        printf("\nDigite uma expressao matematica : ");
        scanf("%s",infix);
        length=strlen(infix);
        for(i=0;i<length;i++) {
                // N�meros s�o separados dos operadores aqui

                if(infix[i]!='+' && infix[i]!='-' && infix[i]!='*' && infix[i]!='/' && infix[i]!='^' && infix[i]!=')' && infix[i]!='(' ) {
          output[j++]=infix[i];
          printf("\n Elemento adicionado na expressao final : %c",infix[i]);
                } else { // Se for um ()

                        if(tos==0) { // Se n�o existir um operador na pilha, adiciona nela

               push(infix[i]);
                           printf("\n Elemento adicionado na pilha :%c",infix[i]);
                        } else { // Operadores s�o retirados e colocados de acordo com a preced�ncia.

                                if(infix[i]!=')' && infix[i]!='(') {
                                        if(preced(infix[i]) <= preced(pilha[tos-1])) {
                      while (preced(infix[i]) && preced(infix[i]) <= preced(pilha[tos-1])) {
                        temp=pop();
                        printf("\n Elemento retirado da pilha :%c",temp);
                        output[j++]=temp;
                      }
                      push(infix[i]);
                      printf("\n Elemento colocado na pilha :%c",infix[i]);
                      mostra();
                                        } else {
                                          push(infix[i]);
                                          printf("\n Elemento adicionado na pilha : %c",infix[i]);
                                          mostra();
                                        }
                                } else {        
                    if(infix[i]=='(') {
                                          push(infix[i]);
                                          printf("\n Elemento colocado na pilha : %c",infix[i]);
                                        }
                                        if(infix[i]==')') {
                                          temp=pop(); 
                      while(temp!='(') {
                        output[j++]=temp;
                                            temp=pop();
                      }
                                        }
                                }
                        }
                }       
        }
        while(tos!=0) {
                output[j++]=pop();
        }
     printf("\n\nA expressao final e : %s\n\n",output);
     
//     system("PAUSE"); 

     return 0;
}

/* [<][>][^][v][top][bottom][index][help] */