利用栈实现逆波兰算法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用栈实现逆波兰算法相关的知识,希望对你有一定的参考价值。
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
以上是关于利用栈实现逆波兰算法的主要内容,如果未能解决你的问题,请参考以下文章