中缀表达式的值

来源:互联网 发布:win10平板软件下载 编辑:程序博客网 时间:2024/06/05 07:59

中缀表达式的值

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

给定一个中缀表达式,编写程序,利用堆栈的方法,计算表达式的值。
输入
第一行为测试数据的组数N
接下来的N行,每行是一个中缀表达式。表达式中只含数字、四则运算符和圆括号,操作数都是正整数,数和运算符、括号之间没有空格。中缀表达式的字符串长度不超过600。
输出
对每一组测试数据输出一行,为表达式的值
样例输入
33+5*8(3+5)*8(23+34*45/(5+6+7))
样例输出
4364108
提示
注意:运算过程均为整数运算(除法运算'/'即按照C++定义的int除以int的结果,测试数据不会出现除数为0的情况),输出结果也为整数(可能为负)。
中间计算结果可能为负。

解题报告

转换的步骤:

1、先给运算符包括(,),+,-,*,/设定优先级

(,)--->不设优先级也可.

+,- 优先级为 2

*,/优先级为 3

2、定义一个保存运算符的栈,栈中元素按优先级高低排列,高优先级在上.为方便操作,定义一个

     优先级最低的符号#存于栈底.

3、从左向右的扫描给定的表达式。

   1)如果当前字符为 0-9的数字,则将其添加到结果(后缀表达式)串中。

   2)如果当前字符为(,则直接将其压入运算符栈中.

   3)如果当前字符为 ),则弹出运算符栈中所有的运算符添加到接过串中,直到遇到闭括号 )为止。

  4)如果当前我字符为 +,-,*,/中的任何一个,(1)、如果当前字符的优先级高于栈顶运算符的优先级,则直接

       将其压入栈中。(2)、如果当前字符的优先级小于等于栈顶运算符的优先级,则将栈中所有优先级大于等于

       当前运算符的运算符弹栈,并添加到结果串中,然后将当前运算符压入栈中.

 5)重复 1)--- 4),扫描完整个表达式。

 6)如果已扫描完表达式,则将栈中余下的运算符都出栈,并且添加到结果串中。处理完毕.


#include <iostream>#include<stack>#include<string>using namespace std;stack <char> p;stack <int> q;string s;void add(){    int a=0,b=0;    char c;    c=p.top();    p.pop();    a=q.top();    q.pop();    b=q.top();    q.pop();    if(c=='+')    {        a=b+a;        q.push(a);    }    else if(c=='-')    {        a=b-a;        q.push(a);    }    else if(c=='*')    {        a=a*b;        q.push(a);    }    else if(c=='/')    {        a=b/a;        q.push(a);    }}int main(){    int n,i,len,m;    cin>>n;    while(n--)    {        cin>>s;        len=s.length();        for(i=0;i<len;i++)        {            if(s[i]<48&&s[i]!=')')            {                if(s[i]=='('||p.empty())                {                    p.push(s[i]);                }                else                {                    if(s[i]=='*'||s[i]=='/')                    {                        if(p.top()=='+'||p.top()=='-'||p.top()=='(')                            p.push(s[i]);                        else                        {                            if(!p.empty())                            {                                while(p.top()!='+'||p.top()!='-'||p.top()!='(')                                {                                    add();                                    if(p.empty())                                        break;                                    else if(p.top()=='+'||p.top()=='-'||p.top()=='(')                                        break;                                }                                p.push(s[i]);                            }                        }                    }                    else if(s[i]=='+'||s[i]=='-')                    {                        if(p.top()=='(')                        {                            p.push(s[i]);                        }                        else                        {                            if(!p.empty())                            {                                while(p.top()!='('||!p.empty())                                {                                    add();                                    if(p.empty())                                        break;                                    else if(p.top()=='(')                                        break;                                }                                p.push(s[i]);                            }                        }                    }                }            }            else if(s[i]==')')            {                while(p.top()!='(')                {                    add();                    if(p.top()=='(')                        break;                }                p.pop();            }            else            {                m=0;                while((s[i]>=48&&s[i]<=57))                {                    m=m*10+s[i]-'0';                    i++;                }                q.push(m);                i--;            }        }        while(!p.empty())        {            add();        }        cout<<q.top()<<endl;    }    return 0;}


原创粉丝点击