中缀表达式的值

来源:互联网 发布:avmoo 2016.7最新域名 编辑:程序博客网 时间:2024/06/05 08:50

由于不想循规蹈矩…所以,不想转后缀再求后缀表达式的值,所以就直接利用中缀表达式和两个栈进行求值,一个栈放数字,另一个栈放操作符.调试的时候稍微遇到了些瓶颈,不过大体来说还是比较顺利的.就是要注意栈非空,栈里只有一个左括号等条件的判定.

中缀表达式的值

总时间限制: 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 <iomanip>#include <string>#include <string.h>#include <stdio.h>#include <stack>using namespace std;int n, len, word_len,temp;char des[700], word[100];stack<int> number;stack<char> symbol;int pri(char a,char b){    if(b=='*' || b=='/')    {        if(a=='*' || a=='/')            return 0;        else            return -1;//a比b优先级低    }    else    {        if(a=='*' || a=='/')            return 1;        else            return 0;    }}void cal(char c,int t1,int t2){    switch(c)    {        case '+':{            number.push(t1+t2);            symbol.pop();            break;        }        case '-':{            number.push(t2-t1);            symbol.pop();            break;        }        case '*':{            number.push(t1*t2);            symbol.pop();            break;        }        case '/':{            number.push(t2/t1);            symbol.pop();            break;        }    }}int main(){    scanf("%d",&n);    while(n--)    {        scanf("%s",&des);        len = strlen(des);        for(int i=0;i<len;i++)        {            if(des[i] == '(')            {                symbol.push(des[i]);            }            else if(des[i]>='0' && des[i]<='9')            {                word[word_len++] = des[i];                if(i+1>=len ||   !(des[i+1]>='0' && des[i+1]<='9'))//数字结束                {                    word[word_len] = '\0';                    temp = atoi(word);                    word_len = 0;                    number.push(temp);                }            }            else if(des[i] == ')')            {                while(symbol.top() != '(')                {                    int t1 = number.top(); number.pop();                    int t2 = number.top(); number.pop();                    cal(symbol.top(),t1,t2);                }                symbol.pop();//弹出左括号            }            else            {                if(symbol.empty() || symbol.top()=='(')                    symbol.push(des[i]);                else if(pri(des[i],symbol.top()) == 1)                {                    symbol.push(des[i]);                }                else                {                    while(!(symbol.empty()) && symbol.top()!='(' && pri(symbol.top(),des[i])>=0)                    {                        int t1 = number.top(); number.pop();                        int t2 = number.top(); number.pop();                        cal(symbol.top(),t1,t2);                    }                    symbol.push(des[i]);                }            }        }        while(!symbol.empty())        {            int t1 = number.top(); number.pop();            int t2 = number.top(); number.pop();            cal(symbol.top(),t1,t2);        }        cout<<number.top()<<endl;        number.pop();    }    return 0;}
1 0
原创粉丝点击