利用栈实现逆波兰算法

原创 2016年05月30日 13:35:13

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

C++学习之(栈) 实践之(逆波兰公式)

栈(statck)这种数据结构在计算机中是相当出名的。栈中的数据是先进后出的(First In Last Out, FILO)。栈只有一个出口,允许新增元素(只能在栈顶上增加)、移出元素(只能移出栈顶...
  • qingzijin2010
  • qingzijin2010
  • 2013年10月29日 09:12
  • 2712

栈:逆波兰式

题目: 假设表达式由数字和双目四则运算符+,-,*,/构成。试利用栈实现一个算法,将一个通常书写形式且书写正确的表达式转换为逆波兰式(后缀表达式),同时将转换后的逆波兰式求值,最后仅需输出求值结果...
  • Simpleholly
  • Simpleholly
  • 2017年07月10日 12:08
  • 201

栈的应用 - 波兰式与逆波兰式

上一篇笔记中,简单讲到了栈的特性,并且给出了栈的实现,现在要利用栈来实现表达式的求值问题。   有三个名词与表达式的计算密切相关,分别是中缀表达式、前缀表达式和后缀表达式,它们都是表达式的一种记法,区...
  • u011836061
  • u011836061
  • 2015年08月05日 15:14
  • 1344

数据结构之用栈实现逆波兰表达式

逆波兰表达式也称为后缀表达式,它将一个算数表达式不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行,如下图所示:650) this.width=650;" src...
  • Reject_UNFAIR
  • Reject_UNFAIR
  • 2016年05月27日 15:35
  • 1069

python 实现逆波兰式

复习实习数据结构:       实现逆波兰式其实搞懂里面的规则就很简单的了。 树的遍历:前序:根左右。中序:左根右。后序:左右根 直接上代码 import operator opMa...
  • bin381
  • bin381
  • 2015年12月14日 22:01
  • 613

【Algorithm】逆波兰表达式 Java实现

Java逆波兰表达式(后缀表达式)
  • huangpingcai
  • huangpingcai
  • 2017年06月29日 09:42
  • 895

Python3实现逆波兰表达式计算

Python3实现逆波兰表达式计算
  • JsonD
  • JsonD
  • 2017年05月01日 10:28
  • 555

java 实现逆波兰计算器

package com.czp; import java.util.HashMap; import java.util.Stack; public class Calculator { //运...
  • JAVA2010CZP
  • JAVA2010CZP
  • 2012年09月29日 22:59
  • 2602

逆波兰 计算器 C语言实现

#include #include #define MAXOP 100 // 操作数或运算符的最大长度 #define NUMBER '0' // 标识找到一个数 int getop(c...
  • cpjlover
  • cpjlover
  • 2017年02月25日 23:38
  • 115

用栈实现单链表的逆转

#include #include using namespace std; struct ListNode { ListNode *next; int data; ListNode...
  • yangshuangtao
  • yangshuangtao
  • 2015年06月25日 12:26
  • 863
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用栈实现逆波兰算法
举报原因:
原因补充:

(最多只允许输入30个字)