后缀表达式 NYOJ 257
来源:互联网 发布:淘宝网会员注册流程 编辑:程序博客网 时间:2024/05/22 09:38
转自http://www.cnblogs.com/xiaofanke/archive/2013/05/29/3106391.html
中缀表达式 转 后缀表达式
一个算术表达式,含有数字(为简化处理,数字只有一位),运算符:+、-、*,以及括号,求表达式的值。
给出的表达式是一般我们见到的中缀表达式,即运算符位于操作数之间。如果把中缀表达式转化为后缀表达式,那么对后缀表达式求值将会很方便。
后缀表达式特点:
1.操作符位于操作数之后;
2.没有括号;
3.运算符没有优先级。
中缀表达式转化为后缀表达式的步骤:
1.初始化一个空操作符栈和空结果字符串;
2.从前到后读取中缀表达式的字符,如果是操作数,加到结果字符串后面;
3.如果是操作符,分两种情况入栈:
a.如果待入栈操作符优先级大于栈顶操作符,直接入栈;
b.如果待入栈操作符优先级小于或等于栈顶操作符,栈顶操作符加到结果字符串后面;重复b过程直到遇到前括号‘(’或栈顶操作符优先级比待入栈操作符小,待入栈操作符入栈。
4.如果是前括号‘(’,直接入栈;
5.如果是后括号,将栈中操作符依次弹出,直至遇到一个前括号‘(’结束。前括号出栈。
最后结果字符串就是后缀表达式。
后缀表达式求值的步骤:
1.初始化一个空操作数栈;
2.从前到后读取后缀表达式字符。如果是操作数直接入栈。如果读到一个操作符@,弹出栈顶元素a和新的栈顶元素b,执行b @ a,将结果压入栈中;
3.最后栈中只剩下一个元素,即表达式的值。
int cal(char c){ switch(c) { case '+': case '-': return 1; case '*': case '/': return 2; default: return -123456; }}int main(){ int T; string s1, ans; stack<char> st; cin >> T; while(T--) { cin >> s1; ans = ""; while(!st.empty()) st.pop(); st.push('#'); int l = s1.length(); for(int i = 0; i < l; i++) { char c = s1[i]; if(isdigit(c)) ans += c; else if(c == '(') st.push(c); else if(c == ')') { while(st.top() != '(') {ans += st.top(); st.pop();} st.pop(); } else { while( cal(c) <= cal(st.top())) { ans += st.top(); st.pop(); } st.push(c); } } while(st.top() != '#') {ans += st.top(); st.pop();} cout << ans << endl; } return 0;}
0 0
- 后缀表达式 NYOJ 257
- NYOJ 257 中缀表达式表示成后缀表达式
- NYOJ 35 表达式求值 【中缀转后缀+后缀表达式求值】
- 数据结构(C++实现):栈的运用--中缀表达式转换为后缀表达式既 nyoj 257
- nyoj-257-中缀转后缀
- 【表达式求值】中缀表达式变后缀+后缀表达式的求法 (NYOJ 35+NYOJ 1272表达式求值)
- nyoj 1272 表达式求值(中缀式转后缀式)
- NYOJ-35-表达式求值(中缀式转后缀式 逆波兰表达式)
- 后缀表达式
- 后缀表达式
- 后缀表达式
- 后缀表达式
- 后缀表达式
- 后缀表达式
- 【后缀表达式】
- 后缀表达式
- 后缀表达式
- 后缀表达式
- 异常的统一处理
- [Android Lint] xxx is not translated in xxx 的解决方法
- 文档导读
- 代码片段你整理
- android之加速感應器
- 后缀表达式 NYOJ 257
- MATLAB 查看程序执行内存最大使用值
- epoll处理并发
- 如何查询文档
- iOS开源框架集合
- 代码设计与敏捷开发
- Android照片墙完整版,完美结合LruCache和DiskLruCache
- java并发编程笔记
- 深度搜索DFS