利用栈实现逆波兰算法

1.逆波兰表达式?   ios

  在咱们的广泛认知中,计算的优先级老是和()相关,形如(1+2)*(3+4)这样的式子,咱们看起来十分的清晰明了,但对计算机来讲,它会进行不少次的判断来肯定一个运算的优先级。因而在好久好久以前就有一我的发现,若是咱们将上述算式写成形如1 2 + 3 4 + *的形式,计算机判断起来会显得格外的快,效率也会更高,然而它的实现原理是什么样的呢。算法

2.算法分析ide

   通过观察,咱们发现该算式将参数放在前面,运算操做符放在两个要进行计算的参数以后,咱们能够得出这样的思路:每次咱们将拿到的数据压栈,当碰见运算符时,就弹出两个数据让他们进行相应的计算,这样,计算完成以后咱们再将运算结果入栈,最后咱们拿到最终结果!
spa

程序实例:ci

#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控制流机制来实现咱们的数据判断使程序显得简洁明了。get

相关文章
相关标签/搜索