4:中缀表达式的值

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

给定一个中缀表达式,编写程序,利用堆栈的方法,计算表达式的值。
输入
第一行为测试数据的组数N
接下来的N行,每行是一个中缀表达式。表达式中只含数字、四则运算符和圆括号,操作数都是正整数,数和运算符、括号之间没有空格。中缀表达式的字符串长度不超过600。
输出
对每一组测试数据输出一行,为表达式的值
样例输入
3
3+5*8
(3+5)*8
(23+34*45/(5+6+7))
样例输出
43
64
108
提示
注意:运算过程均为整数运算(除法运算'/'即按照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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值