利用栈实现逆波兰算法

来源:互联网 发布:成都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
原创粉丝点击