洛谷P1175 表達式的轉換
阿新 • • 發佈:2018-10-15
calc 完成 string names 器) 自己 是把 i++ line
這題看到有挺多人做的,但是好像大部分都是用char做的啊……
這題用char做的話,在我看來還是挺麻煩的。所以說,我選擇使用string(這可是字符串神器)。
思路嘛,就是把中綴表達式先轉為後綴表達式,然後,把後綴表達式進行計算,每遇到一個操作符,將其按照常規計算完成以後,把棧內的數從底到頂輸出,然後再把剩余的未處理字符串輸出,就可以了。
因為要鍛煉自己(懶),所以嘞,我用的棧也是STL的棧,具體使用方法可以google一下。
還有,stringstream這個東西是真的棒。
好吧,上代碼吧。
#include <bits/stdc++.h> using namespace std; int pd(char ch)//判斷優先級 { switch(ch) { case '+': return 50; case '-': return 50; case '*': return 100; case '/': return 100; case '^': return 200; case '(': return 10; case ')': return 25; } } inline string Infix_To_Suffix(string str)//中綴轉後綴 { stack<pair<char,int> > s; stringstream ans;//這個東西是用來保存答案的 int n=str.length()-1; for(int i=0;i<=n;++i) { if(isdigit(str[i])) { int t=str[i]-'0'; ans<<t<<' '; } else { if(str[i]=='(') s.push(make_pair('(',pd('('))); else if(str[i]!=')') { int p=pd(str[i]); while(!s.empty()&&s.top().second>=p) { ans<<s.top().first<<' '; s.pop(); } s.push(make_pair(str[i],p)); } else { while(!s.empty()&&s.top().first!='(') { ans<<s.top().first<<' '; s.pop(); } s.pop(); } } } while(!s.empty()) { ans<<s.top().first<<' '; s.pop(); } string answer; getline(ans,answer); return answer; } int judge(char op,int a,int b)//計算 { switch(op) { case '+':return a+b; case '-':return a-b; case '*':return a*b; case '/':return a/b; case '^':return pow(a,b); } } void print(stack<int> a)//由於STL的stack不好從下往上訪問,所以就寫了個遞歸。 { if(a.empty()) return; int t=a.top(); if(!a.empty()) { a.pop(); print(a); } printf("%d ",t); } int Calc_Suffix(string str)//後綴計算 { stack<int> s,tmp; int n=str.length()-1; for(int i=0;i<=n;i++) { if(isdigit(str[i])) { int t=str[i]-'0'; s.push(t); } else if(str[i]!=' ') { int b=s.top();s.pop(); int a=s.top();s.pop(); s.push(judge(str[i],a,b)); print(s); cout<<str.substr(i+2,n-i-1)<<endl; } } } int main() { string a; cin>>a; string b=Infix_To_Suffix(a); cout<<b<<endl; Calc_Suffix(b); }
洛谷P1175 表達式的轉換