試着用c++寫了一個計算器,支持加減乘除和括號。c++
我是分步完成的,先寫了一個簡單的不支持括號的,而後再改爲支持括號版。spa
用兩個手寫棧(不推薦stl的棧,由於棧不難寫,stl感受太慢),一個棧存儲符號,一個棧存儲已經讀入的數(無符號)。code
掃一遍表達式,把符號和數字按次序存進兩個棧(注意,若是第一個數是正數,則第一個進棧的符號要是+號;若是是負數,則進棧一個-號,存儲數的棧則存進正數)。存儲符號的棧只須要存儲+和-就好了,若是讀到了*或\號,就直接乘除給棧頂的數,這樣能夠保證乘除的優先級。blog
掃完了以後按順序算一遍棧就好了。遞歸
#include <cstdio> #include <cstring> using namespace std; const int maxn=10000; int n; char ch[maxn+5]; int read_pos; //read()讀入時最後一個字符的位置+1 inline int read(int s){ //返回以ch[s]爲開頭的數 int ans=0; for (;(ch[s]>='0'&&ch[s]<='9');s++) ans=ans*10+ch[s]-'0'; read_pos=s; return ans; } int solve(int l,int r){ //表達式l到r的值 int stack[2][maxn+5],len=0; //手寫棧 if (ch[l]!='-') stack[0][++len]=1,stack[1][len]=read(l); else stack[0][++len]=-1,stack[1][len]=read(l+1); l=read_pos; int temp; while (l<=r){ if (ch[l]=='+') stack[0][++len]=1,stack[1][len]=read(l+1); else if (ch[l]=='-') stack[0][++len]=-1,stack[1][len]=read(l+1); else if (ch[l]=='*') temp=read(l+1),stack[1][len]*=temp; else temp=read(l+1),stack[1][len]/=temp; l=read_pos; } int result=0; for (int i=1;i<=len;i++) //處理掉棧中的數 result+=(stack[0][i]*stack[1][i]); return result; } int main(){ // freopen("test2.in","r",stdin); scanf("%s",ch); int tt=strlen(ch); printf("%d",solve(0,tt-1)); return 0; }
應該有不少種模擬方法,我是在預處理時存進每一對括號的位置,而後遞歸計算括號就好了(把括號當數來看)。string
#include <cstdio> #include <cstring> using namespace std; const int maxn=10000; int n; char ch[maxn+5]; int to[maxn+5]; int que[maxn+5],size; int read_pos; int read(int s); int solve(int l,int r){ int stack[2][maxn+5],len=0; if (ch[l]!='-') stack[0][++len]=1,stack[1][len]=read(l); else stack[0][++len]=-1,stack[1][len]=read(l+1); l=read_pos; int temp; while (l<=r){ if (ch[l]=='+') stack[0][++len]=1,stack[1][len]=read(l+1); else if (ch[l]=='-') stack[0][++len]=-1,stack[1][len]=read(l+1); else if (ch[l]=='*') temp=read(l+1),stack[1][len]*=temp; else temp=read(l+1),stack[1][len]/=temp; l=read_pos; } int result=0; for (int i=1;i<=len;i++) result+=(stack[0][i]*stack[1][i]); return result; } int main(){ // freopen("test2.in","r",stdin); scanf("%s",ch); int tt=strlen(ch); for (int i=0;i<tt;i++) if (ch[i]=='(') que[++size]=i; else if (ch[i]==')') to[que[size]]=i,size-=1; printf("%d",solve(0,tt-1)); return 0; } inline int read(int s){ int ans=0,f=1; if (ch[s]=='('){ ans=solve(s+1,to[s]-1); read_pos=to[s]+1; return ans; } else if (ch[s]=='-') f=-1,s+=1; for (;(ch[s]>='0'&&ch[s]<='9');s++) ans=ans*10+ch[s]-'0'; read_pos=s; return ans*f; }