zoj1014 不使用表达式树 ac
来源:互联网 发布:陈鸿一鸣 知乎 编辑:程序博客网 时间:2024/05/01 19:41
#include <iostream>#include <string>using namespace std;void getSubExpr( const string& expr, int idx, string& res);int main(){ char name; string expr; string query; string e, res; int num[100]; char tmp; int n; int x = 0; while (true) { cin>>name; if (name == '*') break; if (x) cout<<endl; x = 1; cout<<"Expression "<<name<<":"<<endl; getchar(); getchar(); cin>>expr; cin>>n; for (int i = 0; i < n; i++) { int t=0; while(cin>>num[t]) { cin.get(tmp); t++; if (tmp == '/n') break; } for (int j = 0; j < t; j++) { cout<<"op("<<num[t-1-j]<<","; } cout<<name; for (int j = 0; j < t; j++) { cout<<")"; } cout<<"="; e = expr; for (int j=0; j<t; j++) { getSubExpr(e, num[j], res); e = res; } cout<<res<<endl; } }}//使用指定的操作符, 看是否能分开表达式 inline bool process(const string& expr, int idx, string& res, char op){ int n = expr.length(); int parenthese = 0; int st = 0; int iCnt = 0; for (int pos = 0; pos < n; pos++) { if ( parenthese==0 && expr[pos] == op ) { iCnt++; if (iCnt == idx) { res = expr.substr(st, pos-st); return true; } st = pos+1; } else if ( expr[pos] == '(' ) parenthese++; else if(expr[pos] == ')') parenthese--; } if (iCnt) { res = expr.substr(st); return true; } return false;}void getSubExpr( const string& expr, int idx, string& res){ int n = expr.length(); if (process(expr, idx, res, '+')) return; if (process(expr, idx, res, '*')) return; if (process(expr, idx, res, '^')) return; //注意一定要最后判断括号, 它优先级最高 if (expr[0] == '(' && expr[n-1]==')') { res = expr.substr(1, n-2); return; } res = expr;}