POJ 中缀表达式的值

来源:互联网 发布:电子翻书制作软件 编辑:程序博客网 时间:2024/06/03 22:45

4:中缀表达式的值

总时间限制:
200ms
内存限制:
1024kB
描述
人们熟悉的四则运算表达式称为中缀表达式,例如(23+34*45/(5+6+7))。在程序设计语言中,可以利用堆栈的方法把中缀表达式转换成保值的后缀表达式(又称逆波兰表示法),并最终变为计算机可以直接执行的指令,得到表达式的值。

给定一个中缀表达式,编写程序,利用堆栈的方法,计算表达式的值。
输入
第一行为测试数据的组数N
接下来的N行,每行是一个中缀表达式。表达式中只含数字、四则运算符和圆括号,操作数都是正整数,数和运算符、括号之间没有空格。中缀表达式的字符串长度不超过600。
输出
对每一组测试数据输出一行,为表达式的值
样例输入
33+5*8(3+5)*8(23+34*45/(5+6+7))
样例输出
4364108
#include<iostream>#include<string>#include<stack>#include<cstdio>using namespace std;const int N=1000;class RPN{public:    RPN(string str):s(str) {}    string transform()    {        stack<char> Stack;        Stack.push('(');        char rpn[N];//此项改为string 型出错。。。string rpn;        int i=0,j=0;        for(; s[i]!='\0'; i++)        {            if('0'<=s[i] && s[i]<='9')            {                rpn[j++]=s[i];            }            else if(s[i]=='*' || s[i]=='/')            {                rpn[j++]=' ';                if(Stack.top()=='*' || Stack.top()=='/')                {                    rpn[j++]=Stack.top();                    Stack.pop();                }                Stack.push(s[i]);            }            else if(s[i]=='+' || s[i]=='-')            {                rpn[j++]=' ';                if(Stack.top()=='*' || Stack.top()=='/')                {                    rpn[j++]=Stack.top();                    Stack.pop();                }                if(Stack.top()=='+' || Stack.top()=='-')                {                    rpn[j++]=Stack.top();                    Stack.pop();                }                Stack.push(s[i]);            }            else if(s[i]=='(' || s[i]==')')            {                if(s[i]=='(')                {                    Stack.push(s[i]);                }                else                {                    while(Stack.top()!='(')                    {                        rpn[j++]=Stack.top();                        Stack.pop();                    }                    Stack.pop();                }            }        }        while(Stack.top()!='(')        {            rpn[j++]=Stack.top();            Stack.pop();        }        rpn[j]='\0';        s=rpn;        return rpn;    }    int Get_res()    {        //cout<<s<<endl;        int a[N]= {0},i=0,j=0;        for(i=0; s[i]!='\0'; i++)        {            if('0'<=s[i] && s[i]<='9')            {                int x=0;                while('0'<=s[i] && s[i]<='9')                {                    x=10*x+s[i]-'0';                    i++;                }                a[j++]=x;                i--;            }            else if(s[i]=='*' || s[i]=='/')            {                j--;                if(s[i]=='*')                {                    a[j-1]*=a[j];                }                else                {                    a[j-1]/=a[j];                }            }            else if(s[i]=='+' || s[i]=='-')            {                j--;                if(s[i]=='+')                {                    a[j-1]+=a[j];                }                else                {                    a[j-1]-=a[j];                }            }            else if(s[i]!=' ')                cout<<"error"<<endl;        }        cout<<a[0]<<endl;        return 0;    }private:    string s;};int main(){    //freopen("in.txt","r",stdin);    int N;    cin>>N;    string str;    while(cin>>str!=0)    {        RPN res(str);        res.transform();        res.Get_res();    }    return 0;}

原创粉丝点击