C/C++ code
/* 完成+,-,*,/和(),并且操作数为个位数的中缀表达式 转后缀表达式操作。假设表达式是合法的 */ string mid_to_postfix(const string &str) { string result;//保存后缀表达式 stack<char> s; map<char,int> m;//存储算符的优先级 /* 规定优先级越高则整数值越大,加减同级别<乘除同级别 (优先级最高,)的优先级不用考虑 */ //建立优先级表 m.insert(make_pair('#',0));//在栈底放置#,其优先级最低 m.insert(make_pair('+',1)); m.insert(make_pair('-',1)); m.insert(make_pair('*',2)); m.insert(make_pair('/',2)); m.insert(make_pair('(',3)); s.push('#'); for(size_t i=0;i!=str.size();++i) { if(isdigit(str[i]))//是一个数字,则立即追加入result中 result.push_back(str[i]); else//是除数字以外的其他情况 { if(str[i]==')')//如果此时扫描到的是右括号,则要进行出栈工作 { //一直出栈,直到遇见( do { result.push_back(s.top()); s.pop(); }while(s.top()!='('); s.pop();//将(弹出栈 } else if(m[str[i]]>m[s.top()])//新来的算符优先级大于栈顶元素的优先级 s.push(str[i]); else { do { if(s.top()=='(')//如果栈顶元素是(,则将运算符直接入栈即可 break; result.push_back(s.top()); s.pop(); }while(m[s.top()]>=m[str[i]]); s.push(str[i]); } } } while(s.top()!='#')//将栈中的剩余算符加入输出中 { result.push_back(s.top()); s.pop(); } return result; }