【第21期】观点:人工智能到底用 GPU?还是用 FPGA?

利用栈实现逆波兰算法

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

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

相关文章推荐

逆波兰表示法

逆波兰表示法(Reverse Polish notation,RPN,或逆波兰记法),是一种是由波兰数学家扬·武卡谢维奇1920年引入的数学表达式方式,在逆波兰记法中,所有操作符置于操作数的后面,因此...

逆波兰表达式实验

原创 转载请注明出处! <strong

逆波兰表达式实验

原创转载请注明出处!包含文件:1.MainFace.java2.JiSuan.java3.HzExp.java实现功能:中缀表达式转换成后缀表达式,利用后缀表达式进行计算.界面如图:逆波兰表达式的产生...

文章收录1

3.Hive Metastore 代码简析 <td width="760" class=

利用栈实现逆波兰计算

#include #include #include #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10 #define MAXBUFFER 1...

20050620 GNU Bison 中文手册翻译完成

20050620 GNU Bison 中文手册翻译完成 GNU Bison实际上是使用最广泛的Yacc-like分析器生成器,使用它可以生成解释器,编译器,协议实现等多种程序. 它不但与Yacc兼容还具有许多Yacc不具备的特性. 这个手册编写十分完整,带你领略Bison在使用中的各个细节(注:并不是实现细节). 如果发现错误,语句不通顺,意思不明,确请立即发邮件把您的建议或者您认为正确的翻译 <a target="_blank" href="mailto:siroun

小猪的数据结构辅助教程——3.3 栈的应用实例:逆波兰式(RPN)

在开始讲解逆波兰式之前,我们先来了解下我们平时数学里是如何写表达式的,比如: 8 * (1 + 2) / (2 + 4),好的,瞄一眼,我们就能得出结果是4,我们是根据运算符 的优先级来计算的,括...

#每周一算法#逆波兰表达式求解

#每周一算法#,今天介绍一下逆波兰表达式的栈实现方式: 概念: 逆波兰表示法也叫后缀表示法,即操作符号都置于操作数的后面,逆波兰表示法可以不用括号来标识操作符的优先级。例如:3+4 是一个中缀表达式,转换成逆波兰表达式为34+ 。有人可能会想有后缀表达式,中缀表达式,那有没有前缀表达式呢?答案是:有前缀表达式,也叫波兰表达式,上文中的3+4 用前缀表达式表示为+34。 用途: 了解了什么是逆波兰表达式,那它有什么具体的用途呢? 1.逆波兰表达式中不需要括号,用户只需按照表达式顺序求值,让堆栈自动记录中间结果;同样的,也不需要指定操作符的优先级 2.机器状态永远是一个堆栈状

Perl实现逆波兰式与递归计算

近一个学期都没有写过博客了,甚至CSDN也很少来了,有点想念这里了。大三忙的比高三还累,早八点出,晚十二点归,弄得自己都不知道是在读大学还是在工作。另一方面兴趣也逐渐转移了,对纯软件没有以前那样着迷,...

数据结构上机作业1-5章

第一章 ◆1.16② 试写一算法,如果三个整数X,Y和Z的值不是依次非递增的,则通过交换,令其为非递增。 void Descend(int &amp;x, int &amp;y, int&amp;z) /* 按从大到小顺序返回x,y和z的值 */ {int t; if(x&lt;y) { t=x; x=y;
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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