栈在表达式求值中的应用

将中缀表达式转成后缀表达式。

#include<iostream>
#include <stack>
#include<map>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

using namespace std;
//把中缀表达式转化为后缀表达式  a+b-a*((c+d)/e-f)+g#    1+2-3*((4+5)/3-6)+7#e
int Complete(int a,int b,char c){
    if(c=='+'){
        return a+b;
    }else if(c=='-'){
        return a-b;
    }else if(c=='*'){
        return a*b;
    }else
       return a/b;
}
//void InitS()
int main(){
    map<char,int> ispM;
    map<char,int> icpM;
    stack<int> s1;
    stack<char> s2;
    char res[20];
    ispM['#']=0;ispM['(']=1;ispM['*']=ispM['/']=5;ispM['+']=ispM['-']=3;ispM[')']=6;
    icpM['#']=0;icpM['(']=6;icpM['*']=icpM['/']=4;icpM['+']=icpM['-']=2;icpM[')']=1;

    s2.push('#');
    char c;
     //InitS();
     int coun=0;
    memset(res,0,sizeof(res));
    while(scanf("%c",&c)!=EOF){
            if(c=='e') {
                break;
            }
        if(c>='0'&&c<='9'){
            res[coun++]=c;
          //  cout<<c;
        }else{
            if(ispM[s2.top()]>icpM[c]){
            while(ispM[s2.top()]>icpM[c]){
                res[coun++]=s2.top();
                s2.pop();
            }
            }
            if(ispM[s2.top()]<icpM[c]){
                s2.push(c);
            }

            if(ispM[s2.top()]==icpM[c]){
                s2.pop();
            }
        }
    }
    for(int i=0;i<coun;i++){
        if(res[i]>='0'&&res[i]<='9'){
            s1.push(res[i]-'0');
        }else  {
            int t1=s1.top();
            s1.pop();
            int t2=s1.top();
            s1.pop();
            int newdata=Complete(t2,t1,res[i]);
            s1.push(newdata);
        }
    }
    cout<<s1.top()<<endl;
    s1.pop();


    return 0;
}

 

posted @ 2016-08-01 20:10  咸咸的告别  阅读(534)  评论(0编辑  收藏  举报