利用栈实现逆波兰算法

原创 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

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

相关文章推荐

逆波兰算法-java实现

二叉树解析实现逆波兰公式算法

public class NiBoLan {  private static final int MAX_NODE = 100;  // 二叉树的结点类  private static cl...

逆波兰算法实现

实现逆波兰算法

逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的...

基于逆波兰RPN算法的计算器实现

/*(1)主要使用stl容器实现栈的操作 *(2)使用vector分离字符与数字 *(3)stack是后进先出的数据结构,可以使用vector比较方便实现 *(4)stack只能插入、删除、访问栈顶的...

二叉树解析实现逆波兰公式算法

public class NiBoLan {  private static final int MAX_NODE = 100;  // 二叉树的结点类  private static clas...

数据结构与算法之栈的应用“逆波兰表达式法”

1 基本信息1.1 表达式逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出。逆波兰表达式又叫做后缀表达式。这个知识点在数据结构和编译原理这两门课程中都有介绍,下面是一些例子:正常的表达式...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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