数据结构之用栈实现逆波兰表达式
来源:互联网 发布:软件测试原则包括 编辑:程序博客网 时间:2024/06/06 05:33
逆波兰表达式也称为后缀表达式,它将一个算数表达式不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行,如下图所示:
在这里我们可以运用栈的特点来实现后缀表达式,思路如下:
1.首先当遇到运算操作数时将其进行push操作;
2.当遇到操作符是将此时的栈pop两次,先取出的栈顶为右操作数;
3.执行此方法到整个数组遍历完。
我们在这里采用了数组来存储后缀表达式中的元素,因为如果用字符串保存的话,首先解析字符串的时候会比较麻烦(既有数字还有字符),其次数组的大小控制也比较方便。
利用枚举的方法将所要用到的运算符和操作数罗列出来
enum Type {OPERAND, //操作数OPERATOR, //操作符ADD,//加法SUB,//减法MUL,//乘法DIV//除法};
这样方便我们后面的操作,可以在自由增减我们需要的运算方法。
#include<iostream>#include<stdlib.h>#include<stack>using namespace std;enum Type {OPERAND, //操作数OPERATOR, //操作符ADD,//加法SUB,//减法MUL,//乘法DIV//除法};struct Cell{Type _type;int _value;};int CountRPN(Cell _a[], size_t _size){stack <int > s;for (size_t i = 0; i < _size; i++){//如果是操作数进行push操作if (_a[i]._type == OPERAND){s.push(_a[i]._value);}//如果是操作符则先将当前栈顶元素取出//再取出另一个操作数做运算//注意:先取出的数为右操作数(在减法和除法中要区分开来)if (_a[i]._type == OPERATOR){int right = s.top();s.pop();int left = s.top();s.pop();switch (_a[i]._value){case ADD:s.push(left + right);break;case SUB:s.push(left - right);break;case MUL:s.push(left * right);break;case DIV:s.push(left / right);break;default:break;}}}return s.top();}int main(){Cell RPNArray[] ={{ OPERAND, 12 },{ OPERAND, 3 },{ OPERAND, 4 },{ OPERATOR, ADD },{ OPERATOR, MUL },{ OPERAND, 6 },{ OPERATOR, SUB },{ OPERAND, 8 },{ OPERAND, 2 },{ OPERATOR, DIV },{ OPERATOR, ADD }};int ret = CountRPN(RPNArray, sizeof(RPNArray) / sizeof(RPNArray[0]));cout << ret << endl;system("pause");return 0;}
运行结果如下:
写在结尾:
本次编程需要注意理解逆波兰表达式的意义,在保存元素时候注意选择用数组而不是字符串。
本文出自 “Original_By_Inn” 博客,转载请与作者联系!
0 0
- 数据结构之用栈实现逆波兰表达式
- 数据结构之逆波兰表达式
- 数据结构----顺序栈实现逆波兰表达式(后缀表达式)求解
- 数据结构学习之栈-逆波兰表达式(一)
- 《数据结构和算法》之逆波兰表达式
- 【数据结构】逆波兰表达式
- 数据结构 栈的应用 逆波兰表达式
- 逆波兰表达式实现
- 逆波兰表达式通过栈实现
- 数据结构与算法之栈的应用“逆波兰表达式法”
- 数据结构-------计算逆波兰表达式(后缀表达式)
- 栈 逆波兰表达式
- 数据结构-----栈(逆波兰表达式)----中缀转后缀
- 数据结构6:使用栈计算逆波兰表达式
- 【数据结构】栈的应用—逆波兰表达式
- 逆波兰表达式算法实现
- 逆波兰表达式java实现
- 逆波兰表达式原理实现
- 编程成长日记——有意思的编程题(二)
- 编程成长日记——杨辉三角
- Docker Rest(Remote) API
- C++之浅谈类与对象
- AndroidStudio 依赖 ButterKnife 出现的空指针异常
- 数据结构之用栈实现逆波兰表达式
- iOS 环信集成方法之集成环信SDK
- DOCKER 容器CPU 配额控制
- Linux系统(X64)安装Oracle11g完整安装图文教程另附基本操作
- android关机流程-framework部分
- 第97课:Spark Streaming在线动态计算特定时间窗口下热门商品排名
- 2016百度春季笔试
- 已备份数据库的磁盘结构版本为611,服务器支持版本为539,无法还原或升级数据库。RESTORE FILELIST 操作异常结束。(MicrosoftSQL Server,错误:3169)
- ibatis 中遇到的 Parameter index out of range (13 > number of parameters, which is 12).问题