首页 > 代码库 > 初级计算器算法(栈处理运算符优先级)

初级计算器算法(栈处理运算符优先级)

运算符的先后计算可以用栈来保存,分别有几种情况

1,当前1+2-3即优先级相同,那么可以先算前一个。

2,1+2*3这种情况我不做处理(注:我每次只选择是否处理上一个)

3,2*8+2这种情况计算前一个。

小细节太多,不说太多,有兴趣的同学留言。

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<stack>
#include<cstring>
#include<algorithm>
using namespace std;

stack<int>num,opt;
int deal()
{
    int now=opt.top();opt.pop();
    int last=opt.top();opt.pop();
    if(last/2<now/2)
    {
        opt.push(last),opt.push(now);
        return 1;
    }
    int a=num.top();num.pop();
    int b=num.top();num.pop();
    int c=num.top();num.pop();
    if(last==0)num.push(c+b);
    else if(last==1)num.push(c-b);
    else if(last==2)num.push(c*b);
    else if(last==3&&b)num.push(c/b);
    else return 2;
    num.push(a);opt.push(now);
    return deal();
}
int solve(char* ss)
{
    int len=strlen(ss),cur=0;
    int tmp=0;
    while(cur<len&&ss[cur]!=' ')
            if(ss[cur]>='0'&&ss[cur]<='9')tmp=tmp*10+ss[cur]-'0',cur++;
            else return false;
    num.push(tmp);opt.push(-2);
    while(cur<len)
    {
        if(ss[++cur]=='+')opt.push(0);
        else if(ss[cur]=='-')opt.push(1);
        else if(ss[cur]=='*')opt.push(2);
        else if(ss[cur]=='/')opt.push(3);
        else return 0;
        if(ss[++cur]==' ')cur++;
        else return 0;
        tmp=0;
        while(cur<len&&ss[cur]!=' ')
            if(ss[cur]>='0'&&ss[cur]<='9')tmp=tmp*10+ss[cur]-'0',cur++;
            else return 0;
        num.push(tmp);
        if(deal()==2)return 2;
    }
    opt.push(0);num.push(0);deal();
    return 1;
}
int getans()
{
    num.pop();
    return num.top();
}
int main()
{
    char ss[200];
    while(gets(ss))
    {
        int key=solve(ss);
        if(key==1)printf("%d\n",getans());
        else if(key==0)printf("格式错误\n");
        else printf("逻辑错误(被除数可能为零?)\n");
        while(!num.empty())num.pop();
        while(!opt.empty())opt.pop();
    }
    return 0;
}


初级计算器算法(栈处理运算符优先级)