利用棧實現逆波蘭算法

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

相關文章
相關標籤/搜索