hnust 1462 表达式求值

         这个我没有用链表做,利用一些栈的思路写下的;

         首先判断优先级 '( ' '* /' ' + - ' ')' 四个优先级从大到小;

         随输入字符计算,如果输入的x优先级小于str中的栈顶,x= ‘ + ’,str[c]=' * ',就从a数组里面弹出两个数,str中弹出栈顶;计算即可,把x和str的下一个栈顶比较;如果输入的x优先级大于str中的栈顶,直接入栈比如x= ‘ / ’,str[c]=' + ',就把x入栈;

           而’(  ‘ 的话就直接入栈,直到匹配到’  )‘在出栈,在代码中有解释的;

最后的a[1]即为答案

#include<iostream>
#include<algorithm>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
typedef long long ll;
char str[520];
int a[520];
int n=0,c=0;
int pan(char x)
{
    int f;
    switch(x)
    {
    case '+':
    case '-':
        if(str[c]=='('||str[c]=='#')f=1;//x前面是这两个,计算不了,x要入栈
        else f=2;//计算前面的表达式
        break;
    case'*':
    case'/':
        if(str[c]=='*'||str[c]=='/')//一样的话就计算前面的表达式咯,按顺序来嘛
            f=2;
        else f=1;//入栈
        break;
    case'(':
        f=1;//出现’(‘ 直接入栈,直到出现 ‘)’再出栈
        break;
    case ')':
        if(str[c]=='(')f=0;//f=0是不用计算前面的表达式,单纯的把(出栈
        else f=2;//把(到这里的表达式计算个干净
        break;
    case '#':
        if(str[c]=='#')f=0;//
        else f=2;//把前面的表达式都计算出来
        break;

    }
    return f;
}
int suan(int a,char x,int b)
{
    int s=0;
    switch(x)
    {
    case'+':
        s=a+b;
        break;
    case'-':
        s=a-b;
        break;
    case'*':
        s=a*b;
        break;
    case'/':
        s=a/b;
        break;
    }
    return s;
}
int  main()
{
    char xx,x;
    int f,l,r,s=0;
    str[++c]='#';//栈底先放个‘#’
    x=getchar();//输入
    while(x!='#'||str[c]!='#')
    {
        if(x<='9'&&x>='0')
        {
            s=s*10+x-'0';//数字就算出来
            x=getchar();
        }
        else
        {
            if(s!=0)
            {
                a[++n]=s;//压入数字栈中
                s=0;//赋值0
            }
            f=pan(x);
            switch(f)
            {
            case 0://只要把字符栈顶弹出去就可以了
                c--;
                x=getchar();
                break;
            case 1://字符栈入栈
                str[++c]=x;
                x=getchar();
                break;
            case 2://计算前面的式子
                r=a[n--];
                l=a[n];
                xx=str[c--];
                a[n]=suan(l,xx,r);//数字栈减小一个,如a【i-1】+a【i】的值存到a【i】中
                //cout<<a[n]<<endl;
                break;
            }
        }
    }
    printf("%d",a[1]);//答案
}

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值