初級計算器演算法(棧處理運算子優先順序)
阿新 • • 發佈:2019-01-31
運算子的先後計算可以用棧來儲存,分別有幾種情況
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; }