带括号的表达式计算
題目描述
算數四則運算的規則是1)先乘除,后加減;2)從左算到右;3)先括號內,后括號外。
由此,算式4+2*3-10/5的計算順序為4+2*3-10/5=4+6-10/5=4+6-2=8。
給定一個以“#”作為結束符的算式,求出算式的結果。
?
輸入
以“#”結尾的表達式,運算數為正整數。每個表達式占一行。
輸出
輸出表達式運算的結果。
樣例輸入
4+2*3-10/5# 3*(7-2)# 2*3/2#樣例輸出
8 15 3 #include<iostream> #include<stack> #include<cstring> #include<string> using namespace std; string s; stack<int> ns; stack<int> os; int idx; //針對有小括號的表達式,策略是擴充符號優先級矩陣 ,左括號優先級最高,右括號優先級最低 //括號內的先運算,右括號不入棧而是運算開始的標志,遇到左括號則括號內運算結束 int map[7][7]={ 1,0,0,0,0,0,0, 1,0,0,0,0,1,1, 1,0,0,0,0,1,1, 1,1,1,0,0,1,1, 1,1,1,0,0,1,1, 1,1,1,1,1,1,1, 1,0,0,0,0,0,0};void getnext(int &flag,int &num,int &op) {flag=0;num=0;int temp=0;int c=1;if(idx==0){os.push(0);} if('0'<=s[idx]&&s[idx]<='9'){flag=0;int last=0;for(int i=idx;i<s.length();i++){if('0'<=s[i]&&s[i]<='9'){last++;}else{break;}}//這樣讀出來的數字是反的 734讀成437for(int i=idx+last-1;i>=idx;i--){if('0'<=s[i]&&s[i]<='9'){//cout<<"s[i]:"<<s[i]<<endl;num+=c*(s[i]-'0');c*=10;}else{break;}}idx+=last;}else{if(s[idx]=='+'){flag=1;num=0;op=1;}if(s[idx]=='-'){flag=1;num=-1;op=2;}if(s[idx]=='*'){flag=1;op=3;}if(s[idx]=='/'){flag=1;op=4;}if(s[idx]=='('){flag=1;op=5;}if(s[idx]==')'){flag=1;op=6;}if(s[idx]=='#'){flag=1;op=0;return;}idx++;}/*if(idx-1==s.length()){flag=1;op=0;return;}*/} int main() {while(cin>>s){idx=0;while(!ns.empty()){ns.pop();}while(!os.empty()){os.pop();}int f,n,o;while(idx<=s.length()){getnext(f,n,o);//printf("標志:%d 數值:%d 符號:%d\n",f,n,o);if(f==0){ ns.push(n); //printf("數值棧中壓入數字 %d\n",n); }else{if(!os.empty()){//printf("符號棧非空 %d %d\n",o,os.top()); if(map[o][os.top()]==1){//printf("符號棧中壓入運算符 %d\n",o); os.push(o);}else{// printf("當前運算符小于棧頂運算符 %d\n",o); //一直彈到大于棧頂符號優先級 while(map[o][os.top()]==0){int top=os.top();if(top==5){os.pop();//這注意! //printf("彈出左括號\n");//彈到左括號了,直接退出 break;}os.pop();//這注意! int n1=ns.top();ns.pop();int n2=ns.top();ns.pop();if(top==1){//printf("取兩個數字運算 %d %d\n",n1,n2); ns.push(n1+n2);}if(top==2){//printf("取兩個數字運算 %d %d\n",n1,n2); ns.push(n2-n1);}if(top==3){//printf("取兩個數字運算 %d %d\n",n1,n2); ns.push(n1*n2);}if(top==4){//printf("取兩個數字運算 %d %d\n",n1,n2); ns.push(n2/n1);}}//才壓入該運算符,這里不壓入右括號了 if(o!=6)os.push(o);//當符號棧中只有兩個O,數值棧中只有最后一個計算結果的時候,運算結束 if(os.top()==0&&os.size()==2&&ns.size()==1){//計算結束 break; } }}}}// printf("運算結果 %d\n",ns.top());printf("%d\n",ns.top());}}?
總結
- 上一篇: windows优化大师怎么用_电脑图标变
- 下一篇: 美团2020校招前端方向笔试题