#include<bits/stdc++.h>#define SE "Syntax Error\n"usingnamespace std;structRule{char prefix, eps, id;
string lc, rc;};
string work(constchar*b,constchar*e, string r){static map<string, Rule> mp{{"E",{0,0,0,"T","E'"}},{"E'",{'+',1,0,"T","E'"}},{"T",{0,0,0,"F","T'"}},{"T'",{'*',1,0,"F","T'"}},{"F",{0,0,1,"E","E"}}};if(mp[r].id){if(e - b ==1&&isdigit(*b))return r +"\n"+string(1,*b)+"\n";if(e - b <2||*b !='('||*(e -1)!=')')return SE;
string s =work(b +1, e -1, mp[r].lc);if(s == SE)return SE;
string ans = r +"\n";for(int p =0, q =0; q < s.size();++q)if(s[q]=='\n'){
ans +="("+ s.substr(p, q - p)+")\n";
p = q +1;}return ans;}if(e - b ==0&& mp[r].eps)return r +"\n\n";if(e - b ==0&& mp[r].prefix)return SE;if(e - b && mp[r].prefix && mp[r].prefix !=*b)return SE;for(int i =(mp[r].prefix ?1:0); i <= e - b;++i){
string lc =work(mp[r].prefix ? b +1: b, b + i, mp[r].lc);if(lc == SE)continue;
string rc =work(b + i, e, mp[r].rc);if(rc == SE)continue;
string ans =(mp[r].prefix ?string(1, mp[r].prefix):"")+ r +"\n", last;for(int p =0, q =0; q < lc.size();++q)if(lc[q]=='\n'){
last =(mp[r].prefix ?string(1, mp[r].prefix):"")+ lc.substr(p, q - p);
ans += last + mp[r].rc +"\n";
p = q +1;}for(int p =0, q =0, first =0; q < rc.size();++q)if(rc[q]=='\n'){if(first)
ans += last + rc.substr(p, q - p)+"\n";else
first =1;
p = q +1;}return ans;}return SE;}intmain(){for(char s[127];scanf("%s", s)!=EOF&&strcmp("#", s);)
cout <<work(s, s +strlen(s),"E")<<"\n";}
输入中缀算术表达式 S,S 中的操作数为非负整数,只含+,-和*,/运算,也可能含有括号(),运算符的计算顺序和实际四则运算的计算顺序相同. 输出表达式 S 的值. 注意除法运算只取整数部分,例如 1/2=0.
Input
输入有多组数据.
每组数据是一个算术表达式 S,S 的长度不超过 100. 输入的 S 保证合法,而且不包含多余的空格或制表符. S 的操作数、中间结果和最终结果都不会超过 int 类型的范围,也不会出现除数为 0 的情况.
输入以#号结束.
Output
对于每个算术表达式 S,输出 S 的值,每个输出占一行.
Sample Input
1478+522
(478+522)*10
1/2-1
#
Sample Output
1100010000
-1
Solution
代 码 复 用
#include<bits/stdc++.h>usingnamespace std;
vector<string>s_to_infix(const string &s){
vector<string> ans;for(int i =0; i < s.size();++i){
ans.push_back("");if(isdigit(s[i])){for(; i < s.size()&&isdigit(s[i]);++i)
ans.back()+= s[i];--i;continue;}
ans.back()+= s[i];}return ans;}
vector<string>infix_to_suffix(const vector<string>&v){
vector<string> ans, op;for(auto&s : v){if(isdigit(s.back()))
ans.push_back(s);elseif(op.empty()|| s =="(")
op.push_back(s);elseif(s ==")"){for(; op.back()!="("; op.pop_back())
ans.push_back(op.back());
op.pop_back();}else{for(;!op.empty()&& op.back()!="("&&(op.back()!="+"&& op.back()!="-"|| s !="*"&& s !="/"); op.pop_back())
ans.push_back(op.back());
op.push_back(s);}}
ans.insert(ans.end(), op.rbegin(), op.rend());return ans;}intpostfix_to_int(const vector<string>&v){
vector<int> stak;for(auto&s : v){if(isdigit(s[0])){
stak.push_back(stoi(s));continue;}int b = stak.back();
stak.pop_back();int a = stak.back();
stak.back()= s =="+"? a + b : s =="-"? a - b : s =="*"? a * b : a / b;}return stak.back();}intmain(){for(string s; cin >> s && s !="#";)
cout <<postfix_to_int(infix_to_suffix(s_to_infix(s)))<<"\n";}