日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

带括号的表达式计算

發布時間:2023/12/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 带括号的表达式计算 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

算數四則運算的規則是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());}}

?

總結

以上是生活随笔為你收集整理的带括号的表达式计算的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。