逆波兰表达式计算
2016-01-02 16:51
381 查看
逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示。
#include<iostream> #include<assert.h> using namespace std; class Stack { public: Stack() :_array(NULL) , _size(0) , _capacity(0) {} Stack(const Stack<T>& s) :_array(new T[s._capacity]) , _size(s._size) , _capacity(s._capacity) { for (int i = 0; i < s._size; ++i) { _array[i] = s._array[i]; } } Stack& operator=(Stack s) { swap(_array, s._array); swap(_size, s._size); swap(_capacity, s._capacity); return *this; } ~Stack() { //cout << "~Stack()" << endl; delete[] _array; _size = _capacity = 0; } void Push(const T& x) { _CheckCapacity(); _array[_size++] = x; } void Pop() { assert(!IsEmpty()); --_size; } bool IsEmpty() { return _size == 0; } bool IsFull() { return _size == _capacity; } size_t Size() { return _size; } const T& Top() { return _array[_size - 1]; } protected: void _CheckCapacity() { if (_size == _capacity) { _capacity = 2 * _capacity + 3; T* tmp= new T[_capacity]; if (_array) { for (int i = 0; i < _size; ++i) { tmp[i] = _array[i]; } delete[] _array; } _array = tmp; } } public: T *_array; size_t _size; size_t _capacity; }; enum SYMBOL { ADD, SUB, MUL, DIV }; enum OpType { OP_NUM, OP_SYMBOL }; struct Cell//单元 { OpType _type; int _value; }; //RNP逆波兰表达式 //12 3 4 + * 6 - 8 2 / + //82 Cell RNPArray[11]= { { OP_NUM, 12 } ,{ OP_NUM, 3 } ,{OP_NUM, 4} ,{OP_SYMBOL,ADD} ,{OP_SYMBOL, MUL} , {OP_NUM,6} , {OP_SYMBOL,SUB} , {OP_NUM,8} , {OP_NUM,2} , {OP_SYMBOL,DIV} , {OP_SYMBOL,ADD} }; int CountRNP(Cell* RNPExp, size_t size) { Stack<int> s; for (size_t i = 0; i < size; ++i) { if (RNPExp[i]._type == OP_NUM) { s.Push(RNPExp[i]._value); } else { int right = s.Top(); s.Pop(); int left = s.Top(); s.Pop(); switch (RNPExp[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: //保证right!=0 // assert(!right); s.Push(left / right); break; } } } return s.Top(); } int main() { //栈的特点:后进先出,只能从尾部进行操作 cout << CountRNP(RNPArray, 11) << endl; system("pause"); return 0; }
相关文章推荐
- Lua学习笔记之运算符和表达式
- Lua教程(三):表达式和语句
- Lua基础教程之赋值语句、表达式、流程控制、函数学习笔记
- Ruby中case表达式详解
- 实例详解C#正则表达式
- C#编程自学之运算符和表达式
- 理解C#中的Lambda表达式
- javascript属性访问表达式用法分析
- JavaScript中:表达式和语句的区别[译]
- 详解JavaScript的表达式与运算符
- js 中的switch表达式使用示例
- js表达式计算器代码
- SQLite教程(六):表达式详解
- 用PHP实现的四则运算表达式计算实现代码
- Javascript表达式中连续的 && 和 || 之赋值区别
- javascript 用函数语句和表达式定义函数的区别详解
- JavaScript表达式:URL 协议介绍
- python 中的列表解析和生成表达式
- Lua中的操作符和表达式总结
- 将数字转换成大写的人民币表达式的js函数