4:中缀表达式的值

来源:互联网 发布:三门峡算法工程师招聘 编辑:程序博客网 时间:2024/06/06 01:57
总时间限制: 
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的情况),输出结果也为整数(可能为负)。

中间计算结果可能为负。



100多行的代码。未能过此题,始终觉得是个遗憾。。

第一次写表达式求值


要先设置一个运算符的栈,从左只有扫描中缀表达式(百度的哦)
1、如果遇到数字,直接放到后缀表达式尾;
2、如果遇到遇到运算符
   a:若此时栈空,则直接入栈;
   b:循环:若栈st不空且栈顶运算符的优先级大于等于当前的运算符,则栈顶运算符出栈,置于后缀表达式尾;
   c:若栈不空且栈顶运算符的优先级小于当前的运算符,则将此运算符直接入栈;
反复执行1,2,直到整个中缀表达式扫描完毕,若此时栈不空,则将栈顶的运算符依次出栈,依次置于后缀表达式尾。

下面是错误代码。求指正。。 

100多行不容易看。。。

#include<iostream>#include<stdio.h>#include<string.h>#include<algorithm>#include<assert.h>#include<ctype.h>#include<stack>using namespace std;int main(){    int N;    scanf("%d%*c",&N);    while(N--)    {        char a[1001],b[1001];        gets(a);        stack<char> hou;        stack<int> ji;        int i,h=0;        int len=strlen(a);        for(i=0; i<len; i++)        {            if(isalnum(a[i]))            {                while(isalnum(a[i])&&i<len)                {                    b[h++]=a[i++];                }                b[h++]='!';            }            if(a[i]=='(')hou.push(a[i]);            if(a[i]=='*'||a[i]=='/'){                while(!hou.empty()&&hou.top()!='('&&(hou.top()=='*'||hou.top()=='/')){                      b[h++]=hou.top();                      hou.pop();                      }                      hou.push(a[i]);            }            if(a[i]=='+'||a[i]=='-')            {                while(!hou.empty()&&hou.top()!='('&&(hou.top()=='*'||hou.top()=='/'||hou.top()=='+'||hou.top()=='-'))                {                    b[h++]=hou.top();                    hou.pop();                }                hou.push(a[i]);            }            if(a[i]==')')            {                while(!hou.empty()&&hou.top()!='(')                {                    b[h++]=hou.top();                    hou.pop();                }                hou.pop();            }        }        while(!hou.empty())        {            b[h++]=hou.top();            hou.pop();        }        int T[100]= {0}, G=0;        int a1,a2;        int ans;        for(i=0; i<h; i++)        {            if(isalnum(b[i]))            {                while(b[i]!='!'&&i<h)                {                    T[G]=T[G]*10+(b[i]-'0');                    i++;                }                if(b[i]=='!')                {                    ji.push(T[G]);                    G++;                }            }            if(b[i]=='+')            {                if(!ji.empty())                {                    a1=ji.top();                    ji.pop();                }                if(!ji.empty())                {                    a2=ji.top();                    ji.pop();                }                ans=a1+a2;                ji.push(ans);            }            if(b[i]=='*')            {                if(!ji.empty())                {                    a1=ji.top();                    ji.pop();                }                if(!ji.empty())                {                    a2=ji.top();                    ji.pop();                }                ans=a1*a2;                ji.push(ans);            }            if(b[i]=='-')            {                if(!ji.empty())                {                    a1=ji.top();                    ji.pop();                }                if(!ji.empty())                {                    a2=ji.top();                    ji.pop();                }                ans=a2-a1;                ji.push(ans);            }            if(b[i]=='/')            {                if(!ji.empty())                {                    a1=ji.top();                    ji.pop();                }                if(!ji.empty())                {                    a2=ji.top();                    ji.pop();                }                ans=a2/a1;                ji.push(ans);            }        }    if(!ji.empty()){ans=ji.top();}    printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击