中缀表达式转后缀表达式(逆波兰表达式)
2014-04-25 02:29
337 查看
比较适合C++的转换方法
个人觉得这种写法比较漂亮
个人觉得这种写法比较漂亮
#include <iostream> #include <stack> #include <string> using namespace std; /* 中缀表示法 转 逆波兰表示法(RPN) 【一】读取一个字符 1. 如果遇到的是一个数字,输出 2. 如果遇到的是一个左括号,入棧 3. 如果遇到的是一个右括号,出棧,直到遇到一个左括号(若没有左括号,出错) 4. 如果遇到的是一个运算符 1. 如果棧为空或比栈顶运算符优先级高,入棧,回到 【一】 ( 左括号的优先级最低) 2. 如果栈顶运算符优先级较高,弹出栈顶运算符,回到 4.1 */ string RPN(string& exp) { stack<char> opStack; string rString; const string blank = " "; int len = exp.length(); for(int i = 0; i < len; i++) { char ch = exp.at(i); switch (ch) { case ' ': break; case '(': opStack.push(ch); break; case ')': while( ( ch = opStack.top() ) != '(') { rString.append(blank + ch); opStack.pop(); } case '+': case '-': case '*': case '/': while(1) { if( opStack.empty() || opStack.top() == '(' || ( ch == '*' || ch == '/' ) && (opStack.top() == '+' || opStack.top() == '-') ) { opStack.push(ch); break; } else { rString.append(blank + opStack.top()); opStack.pop(); } } break; // 对数字的处理 default: rString.append(blank + ch); break; } } while( !opStack.empty()) { if(opStack.top() != '(') rString.append(blank + opStack.top()); opStack.pop(); } return rString; } int main() { string exp; while(1) { getline(cin,exp); if(exp != "#") cout << exp << " , " << RPN(exp) << endl; else break; } return 0; }
相关文章推荐
- C语言利用栈实现将中缀表达式转换为后缀表达式(即逆波兰式)
- 逆波兰计算器与中缀表达式向后缀表达式的转化实例
- 中缀表达式转后缀表达式(逆波兰表达式)
- 中缀表达式转换为后缀表达式及逆波兰式计算
- 中缀表达式转换成后缀表达式以及逆波兰表示法求值
- 【数据结构】逆波兰表示法(RPN):中缀表达式转后缀表达式
- 逆波兰计算器--中缀表达式转后缀表达式
- 逆波兰中 中缀表达式转后缀表达式的方法
- 整理一下中缀表达式转后缀表达式(逆波兰表达式)的算法-调度场算法(shunting yard algorithm)
- 中缀表达式转后缀(逆波兰)表达式
- 逆波兰:将中缀表达式转为后缀表达式
- 将中缀表达式转化成后缀表达式(逆波兰式)
- 中缀表达式转化为后缀表达式,计算中缀表达式,计算后缀表达式(有注释)(逆波兰表达式)
- 逆波兰式(中缀表达式转成后缀表达式)
- 中缀表达式转后缀表达式
- java实现中缀表达式转后缀表达式并且计算
- 1003. 中缀表达式转后缀表达式
- 关于中缀表达式和后缀表达式
- 中缀表达式转后缀表达式
- CSUFT 编译原理实验三 中缀表达式转逆波兰表达式求值