【数据结构】用栈实现对后缀表达式的计算
2016-11-27 17:12
302 查看
首先提一句,我所用的IDE是VS2013。编译器不同,所支持的特性也就不同;
现在的C++已经发展到C++11版本,因此VS2008基本就不支持C++11新的特性;
我们用后缀表达式,利用数据结构中的栈,进行结果的计算
如果是操作数,则压栈
如果是操作符,则出栈两个元素,根据操作符进行计算之后再压栈
现在的C++已经发展到C++11版本,因此VS2008基本就不支持C++11新的特性;
我们用后缀表达式,利用数据结构中的栈,进行结果的计算
如果是操作数,则压栈
如果是操作符,则出栈两个元素,根据操作符进行计算之后再压栈
#include<iostream> using namespace std; #include"Stack.h" enum Type//定义一个枚举类型,让我们观察起来更加直观 { OP_SYMBOL, OP_NUM, ADD, SUB, MUL, DIV, }; struct Cell//定义Cell结构体 { Type _type;//类型 int _value;//值 }; int CountRPN(Cell* cell, size_t n) { Stack<int> s;//这里我们用的是上篇博客自己写的栈,与库提供的稍有区别,这里需要引上篇博客的头文件,否则就改成库函数的 for (size_t idx = 0; idx < n; ++idx) { if (cell[idx]._type == OP_NUM)//判断是否为操作数,是操作数就入栈 { s.Push(cell[idx]._value); } else if (cell[idx]._type == OP_SYMBOL)//当类型为操作符,就取出两个元素,求值再压栈 { int right = s.Top(); s.Pop(); int left = s.Top(); s.Pop(); switch (cell[idx]._value) { case ADD: s.Push(left + right); break; case SUB: s.Push(left - right); break; case MUL: s.Push(left * right); break; case DIV: if (right == 0) throw invalid_argument("表达式错误"); s.Push(left / right); break; default: throw invalid_argument("表达式错误"); break; } } else//类型错误,抛出异常 { throw invalid_argument("表达式错误"); } } return s.Top();//返回栈中最后一个元素,就是我们求得的结果 }
相关文章推荐
- 【数据结构】用栈实现的简单计算器(先转换为后缀表达式、可以计算带括号的)
- 数据结构实现中缀表达式到后缀表达式,再到计算出结果的代码
- 数据结构—中缀表达式转后缀表达式算法及实现—栈的应用—计算表达式(C++代码实现)(1)
- 堆栈的应用(2) 中缀算术表达式到后缀(逆波兰记法reverse polish notation)的转换及其计算 C++实现
- [转载]数据结构中用C#实现"表达式计算"
- Java堆栈的应用2----------中缀表达式转为后缀表达式的计算Java实现
- 利用栈的数据结构实现中缀表达式到后缀表达式的转换
- 数据结构习作之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java) (技术含量少许)
- 栈实现表达式计算【数据结构】
- java实现中缀表达式转后缀表达式并且计算
- java实现中缀表达式转后缀表达式并且计算
- 数据结构中用栈实现表达式的计算
- java实现中缀表达式转后缀表达式并且计算
- Qt计算器开发(一):后缀表达式实现完整数学表达式的计算
- 堆栈的应用(2) 中缀算术表达式到后缀(逆波兰记法reverse polish notation)的转换及其计算 C++实现
- 数据结构中用C#实现"表达式计算"
- c语言数据结构实现后缀表达式求值
- 后缀表达式计算的代码实现
- 栈实现后缀表达式的计算
- 数据结构中用C#实现“表达式计算”