C++实现中缀表达式转前、后缀
2015-09-08 00:13
393 查看
#include<iostream> #include<string> #include<stack> using namespace std; bool isInt(char ch) { if(ch>='0'&&ch<='9') return true; return false; } bool isOperator(char ch) { if(ch=='+'||ch=='-'||ch=='*'||ch=='/') return true; return false; } int opLevel(char ch) { int level; switch(ch) { case'+': case'-': level=1; break; case'*': case'/':level=2; break; default: level=0; break; } return level; } /*中缀-->前缀 算法 1)求输入串的逆序。 2)检查输入的下一元素。 3)假如是操作数,把它添加到输出串中。 4)假如是闭括号,将它压栈。 5)假如是运算符,则 i)假如栈空,此运算符入栈。 ii)假如栈顶是闭括号,此运算符入栈。 iii)假如它的优先级高于或等于栈顶运算符,此运算符入栈。 iv)否则,栈顶运算符出栈并添加到输出串中,重复步骤5。 6)假如是开括号,栈中运算符逐个出栈并输出,直到遇到闭括号。闭括号出栈并丢弃。 7)假如输入还未完毕,跳转到步骤2。 8)假如输入完毕,栈中剩余的所有操作符出栈并加到输出串中。 9)求输出串的逆序。 */ string priOrder(string myStr) { stack<char> opStack; string result; for(int i=myStr.length()-1; i>=0; i--) { char ch=myStr[i]; if(isInt(ch)) { result.push_back(ch); } else if(')'==ch) { opStack.push(ch); } else if(isOperator(ch))//操作符 { while(true) { if(opStack.empty()||opStack.top()==')'||(opLevel(ch)>=opLevel(opStack.top()))) { opStack.push(ch); break; } else { result.push_back(opStack.top()); opStack.pop(); } } } else if('('==ch) { while(opStack.top()!=')') { result.push_back(opStack.top()); opStack.pop(); } opStack.pop(); } } while(!opStack.empty()) { result.push_back(opStack.top()); opStack.pop(); } return result; } /*中缀-->后缀 算法 */ string postOrder(string myStr) { string result; stack<char> opStack; for(int i=0; i<myStr.length(); i++) { char ch=myStr[i]; if(isInt(ch)) { result.push_back(ch); } else if('('==ch) { opStack.push(ch); } else if(isOperator(ch)) { while(true) { if(opStack.empty()||opStack.top()=='('||opLevel(ch)>=opLevel(opStack.top())) { opStack.push(ch); break; } else { result.push_back(opStack.top()); opStack.pop(); } } } else if(')'==ch) { while(opStack.top()!='(') { result.push_back(opStack.top()); opStack.pop(); } opStack.pop(); } } while(!opStack.empty()) { result.push_back(opStack.top()); opStack.pop(); } return result; } int main() { string myStr; cin>>myStr; string result; result=priOrder(myStr); for(int i=result.length()-1; i>=0; i--) { cout<<result[i]; } cout<<endl; result=postOrder(myStr); for(int i=0; i<=result.length(); i++) { cout<<result[i]; } return 0; }
相关文章推荐
- C++尽量不要使用#define
- 【C++注意事项】3 引用
- 斐波那契数(C/C++,Scheme)
- 【C++注意事项】2 变量声明和定义
- 在Code::Blocks中使用C++11标准
- 【C++注意事项】7 Library vector Type
- 【C++注意事项】1 数据类型及类型转换
- 霍纳规则(C/C++,Scheme)
- 【C++注意事项】4 指针 Pointers
- 字符串(C语言)
- 【C++注意事项】5 Top-level const , The auto and decltype Type Specifier
- 【C++注意事项】6 Library string Type
- 如何在Visual Studio和CodeBlocks中反编译C++代码
- 字梯游戏(C++)
- 预处理指令
- c++ iterator(迭代器)分类及其使用
- 【C++学习笔试】-模板
- C语言用二维数组实现开关灯泡游戏
- C++Builder 10 应用VCL Style,如何使用皮肤
- C/C++学习笔记---高地址、低地址、大段字节序、小段字节序