1. 程式人生 > >棧的鏈式儲存結構,逆波蘭表示式

棧的鏈式儲存結構,逆波蘭表示式

棧鏈

teypedef struct StackNode
{
	ElemType data;		// 存放棧的資料
	struct StackNode *next;
} StackNode, *LinkStackPtr;
teypedef struct LinkStack
{
	LinkStackPrt top;	// top指標
	int count;			// 棧元素計數器
}

進棧操作

對於棧鏈的Push操作,假設元素值為e的新結點是s,top為棧頂指標,我們得到如下程式碼:

Status Push(LinkStack *s, ElemType e)
{
	LinkStackPtr p = (LinkStackPtr) malloc (sizeof(StackNode));
	p->data = e;
	p->next = s->top;
	s->top = p;
	s->count++;
 
	return OK;
}

出棧操作

至於鏈棧的出戰Pop操作,假設變數p用來儲存要刪除的棧頂結點,將棧頂指標下移一位,最後釋放p即可。

Status Pop(LinkStack *s, ElemType *e)
{
	LinkStackPtr p;
	if( StackEmpty(*s) )  // 判斷是否為空棧
		return ERROR;
 
	*e = s->top->data;
	p = s->top;
	s->top = s->top->next;
	free(p);
	s->count--;
 
	return OK;
}

終極實踐

在講解這道例題的時候,請允許小甲魚花一點點的時間對小學時候的數學老師進行感謝,嗯,謝謝您,讓我學會如何計算以下這道表示式,並且認為它十分簡單:(1-2)*(4+5)

人類早就熟悉這種中綴表示式的計算方式,隨便拉一個小朋友過來,給他一顆糖,他會馬上告訴你這個結果應該是等於-9,因為括號裡邊的要先進行計算。

但是計算機不喜歡了,因為我們有小括號中括號大括號,還允許一個巢狀一個,這樣子計算機就要進行很多次if判斷才行決定哪裡先計算。

逆波蘭表示式

後來,在20世紀三十年代,波蘭邏輯學家Jan.Lukasiewicz不知道是像牛頓一樣被蘋果砸到腦袋而想到萬有引力原理,或者還是像阿基米德泡在浴缸裡突發奇想給皇冠是否純金做驗證,總之他也是靈感閃現了,然後發明了一種不需要括號的字尾表示式,我們通常把它稱為逆波蘭表示式(RPN) 。

很多魚油好奇為什麼他發明的東西是以他的國籍而不是以他的名字命名的呢?這也告訴我們,想要流芳百世,名字還得起得朗朗上口才行。

我們先來看看,對於(1-2)*(4+5),如果用逆波蘭表示法,應該是這樣:1 2 – 4 5 + *

這種方式敢情我們人類是不大好接受的了,不過對於計算機來說,那可是喜愛至極。

因為只需要利用棧的特點,就可以將這種字尾表示式的效能發揮到極致。

解析來就讓小甲魚圖文並茂的解釋一下吧!

No pic you say a J8……

數字1和2進棧,遇到減號運算子則彈出兩個元素進行運算並把結果入棧。

逆波蘭計演算法

4和5入棧,遇到加號運算子,4和5彈出棧,相加後將結果9入棧。

逆波蘭計演算法

然後又遇到乘法運算子,將9和-1彈出棧進行乘法計算,此時棧空並無資料壓棧,-9為最終運算結果!

逆波蘭計演算法