利用栈实现逆波兰算法
来源:互联网 发布:成都java工资水平 编辑:程序博客网 时间:2024/06/13 21:44
1.逆波兰表达式?
在我们的普遍认知中,计算的优先级总是和()相关,形如(1+2)*(3+4)这样的式子,我们看起来十分的清晰明了,但对计算机来说,它会进行很多次的判断来确定一个运算的优先级。于是在很久很久之前就有一个人发现,如果我们将上述算式写成形如1 2 + 3 4 + *的形式,计算机判断起来会显得格外的快,效率也会更高,然而它的实现原理是什么样的呢。
2.算法分析
经过观察,我们发现该算式将参数放在前面,运算操作符放在两个要进行计算的参数之后,我们可以得出这样的思路:每次我们将拿到的数据压栈,当遇见运算符时,就弹出两个数据让他们进行相应的计算,这样,计算完成之后我们再将运算结果入栈,最后我们拿到最终结果!
程序实例:
#include<iostream>using namespace std;typedef char Element;struct Node{Element data;Node *next;Node(Element d) :data(d), next(NULL){}};class DStack{private:Node *top;int size;public:DStack() : top(NULL){}~DStack(){if (top != NULL){Node *del = top;top = top->next;delete del;del = NULL;}}public:void Push(Element d){Node *newNode = new Node(d);newNode->next = top;top = newNode;size++;}Element Pop(){Element re = top->data;top = top->next;size--;return re;}};int RPN(){DStack s1;char tmp = 0;int a = 0, b = 0, c = 0;cout << "please enter a RPN :" << endl;while (1){cin >> tmp;if (tmp == '#')break;switch (tmp){case'0':case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8':case'9':s1.Push(tmp);break;case'+': a = s1.Pop()-'0'; b = s1.Pop() - '0'; c = a + b;s1.Push(c + '0');break;case'-': a = s1.Pop() - '0'; b = s1.Pop() - '0'; c = a - b;s1.Push(c + '0');break;case'*': a = s1.Pop() - '0'; b = s1.Pop() - '0'; c = a * b;s1.Push(c + '0');break;case'/': a = s1.Pop() - '0'; b = s1.Pop() - '0'; c = a / b;s1.Push(c + '0');break;default:exit(0);break;}}int re = s1.Pop() - '0';return re;}int main(){int a = RPN();cout << "计算结果是:" << a << endl;getchar();getchar();return 0;}
综上,我们选择使用switch case控制流机制来实现我们的数据判断使程序显得简洁明了。
本文出自 “Zimomo” 博客,请务必保留此出处http://zimomo.blog.51cto.com/10799874/1754909
0 0
- 利用栈实现逆波兰算法
- 逆波兰式--利用栈实现
- 利用栈实现逆波兰计算
- 利用栈实现逆波兰式求值
- 实现逆波兰算法
- 逆波兰表达式算法实现
- 逆波兰算法的实现
- 数据结构---栈--逆波兰算法
- 逆波兰式 栈实现
- 利用栈实现计算器,先转换为逆波兰式之后运算
- 逆波兰式算法
- java 逆波兰算法
- 逆波兰表达式算法
- 逆波兰表达式算法
- 逆波兰算法
- 逆波兰算法源码
- 逆波兰表达式算法
- 逆波兰计算法
- Linux基础——系统分区
- Something About Expert C Programming
- 初识C++(一)
- ViewPage + Fragment原理分析
- C++ 继承&多态
- 利用栈实现逆波兰算法
- 空指针也能调用成员函数?
- 《深入理解Linux内核》软中断/tasklet/工作队列
- Somethings About 《c++编程思想》
- RAII&智能指针
- 用栈实现迷宫游戏寻路
- jstl学习
- 挖坟字符串知识点
- Linux基础篇一