hnust 1462 表达式求值

hnust 1462 表达式求值,第1张

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

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

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

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

最后的a[1]即为答案

#include
#include
#include
#include
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://只要把字符栈顶d出去就可以了
                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<

 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/584627.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-12
下一篇 2022-04-12

发表评论

登录后才能评论

评论列表(0条)