1. 程式人生 > >利用棧實現逆波蘭演算法

利用棧實現逆波蘭演算法

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控制流機制來實現我們的資料判斷使程式顯得簡潔明瞭。