逆波兰表达式(后缀表达式)
2016-04-16 11:23
357 查看
逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出。逆波兰表达式又叫做后缀表达式。下面是一些例子:
正常的表达式 逆波兰表达式
a+b ---> a,b,+
a+(b-c) ---> a,b,c,-,+
a+(b-c)*d ---> a,b,c,-,d,*,+
a+d*(b-c)--->a,d,b,c,-,*,+
a=1+3 ---> a=1,3 +
通过后缀表达式计算表达式值的过程:顺序访问表达式的每一项,若该项为操作数,则将其压入栈中;若该项是操作符<op>,则连续从栈中退出两个操作数X和Y,形成运算指令X<op>Y,将其结果重新压入栈中。当表达式的每一项都访问并处理,则其计算结果就是当前栈顶存放的值。
![](http://s3.51cto.com/wyfs02/M02/7F/0F/wKiom1cRoPzjH6jTAADigqnigtw229.png)
下面我们以表达式4+3*4+3*(1+5)———>434*+315+*+
![](http://s5.51cto.com/wyfs02/M00/7F/0F/wKiom1cRruiRNauDAAAozqj3MnI717.png)
源程序:
![](http://s3.51cto.com/wyfs02/M01/7F/10/wKiom1cRr6XSOlOxAAAuTSMk3do923.png)
正常的表达式 逆波兰表达式
a+b ---> a,b,+
a+(b-c) ---> a,b,c,-,+
a+(b-c)*d ---> a,b,c,-,d,*,+
a+d*(b-c)--->a,d,b,c,-,*,+
a=1+3 ---> a=1,3 +
通过后缀表达式计算表达式值的过程:顺序访问表达式的每一项,若该项为操作数,则将其压入栈中;若该项是操作符<op>,则连续从栈中退出两个操作数X和Y,形成运算指令X<op>Y,将其结果重新压入栈中。当表达式的每一项都访问并处理,则其计算结果就是当前栈顶存放的值。
![](http://s3.51cto.com/wyfs02/M02/7F/0F/wKiom1cRoPzjH6jTAADigqnigtw229.png)
下面我们以表达式4+3*4+3*(1+5)———>434*+315+*+
![](http://s5.51cto.com/wyfs02/M00/7F/0F/wKiom1cRruiRNauDAAAozqj3MnI717.png)
源程序:
#pragma once #include<iostream> #include<assert.h> #include<stack> using namespace std; enum Type { OP_NUM, OP_SYMBOL, }; enum SYMBOL { ADD, SUB, MUL, DIV, }; struct Cell { Type _type; int _value; }; double CountRNP(Cell *a, size_t size) { assert(a); stack<double> s; double right = 0; double left = 0; for (size_t i = 0; i < size; i++) { if (a[i]._type == OP_NUM) { s.push(a[i]._value); } else { if (s.empty()) { return 0; } right = s.top(); if (s.empty()) { return 0; } s.pop(); 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: if (left== 0) { cout << "error" << endl; } else { s.push(right / left); } break; } } } return s.top(); }测试代码:
#include"calculate.h" int main() { Cell a[] = { { OP_NUM, 4 }, { OP_NUM, 3 }, { OP_NUM, 4 }, { OP_SYMBOL, MUL }, { OP_SYMBOL, ADD }, { OP_NUM, 3 }, { OP_NUM, 1 } , { OP_NUM, 5 }, { OP_SYMBOL, ADD }, { OP_SYMBOL, MUL }, { OP_SYMBOL, ADD } }; size_t size = sizeof(a) / sizeof(a[0]); cout << CountRNP(a, size) << endl; system("pause"); return 0; }结果:
![](http://s3.51cto.com/wyfs02/M01/7F/10/wKiom1cRr6XSOlOxAAAuTSMk3do923.png)
相关文章推荐
- Lua学习笔记之运算符和表达式
- Lua教程(三):表达式和语句
- Lua基础教程之赋值语句、表达式、流程控制、函数学习笔记
- Ruby中case表达式详解
- 剖析C++中的常量表达式与省略号的相关作用
- 实例详解C#正则表达式
- C#编程自学之运算符和表达式
- 理解C#中的Lambda表达式
- javascript属性访问表达式用法分析
- JavaScript中:表达式和语句的区别[译]
- 详解JavaScript的表达式与运算符
- js 中的switch表达式使用示例
- js表达式计算器代码
- SQLite教程(六):表达式详解
- 用PHP实现的四则运算表达式计算实现代码
- Javascript表达式中连续的 && 和 || 之赋值区别
- javascript 用函数语句和表达式定义函数的区别详解
- JavaScript表达式:URL 协议介绍
- python 中的列表解析和生成表达式
- Lua中的操作符和表达式总结