1. 程式人生 > >初級計算器演算法(棧處理運算子優先順序)

初級計算器演算法(棧處理運算子優先順序)

運算子的先後計算可以用棧來儲存,分別有幾種情況

1,當前1+2-3即優先順序相同,那麼可以先算前一個。

2,1+2*3這種情況我不做處理(注:我每次只選擇是否處理上一個)

3,2*8+2這種情況計算前一個。

小細節太多,不說太多,有興趣的同學留言。

輸入格式:1 + 2 + 3 + 4(即運算子兩邊要加一個空格,不能多)。不要覺得這樣是麻煩的做法,處理格式不嚴謹的字串容易會發生各種各樣的錯誤,還不如只處理一種規格定死的,反正別的轉過來很容易不是。

樣例 :1 + 2 + 4 * 3 / 2 + 1

1 + 2 + 4 * 3 / 0 + 1

1 + 2 + 4 * 3 / 2  + 1

輸出:10

邏輯錯誤(被除數可能為零?)

格式錯誤

第三組最後一個加號前多了個空格

程式碼:

#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;
}