鏈棧以及中綴表示式轉字尾表示式並求值的鏈棧實現

2021-10-24 00:18:32 字數 3615 閱讀 9888

多鏈棧棧的應用:表示式求值

為了便於操作,採用帶頭結點的單鏈表實現棧,把鍊錶的頭指標作為棧頂指標。

採用鏈棧不必預先估計棧的最大容量,只要系統有可用的空間,鏈棧就不會出現溢位的情況。對於鏈棧,使用完畢後,應該釋放其空間。

鏈棧的各種基本操作的實現與單鏈表的操作類似。鏈棧分為一般鏈棧多鏈棧

一般鏈棧型別如下:

typedef

struct nodenode,

*liststack;

用top為棧頂指標,始終指向頭節點。若top->next = null,則表示棧空。

下面介紹一般鏈棧的幾種操作是如何實現的。

建立乙個棧的頭節點,返回指向頭節點的指標。

liststack creatstack (

)

首先申請空間,如果申請失敗,則返回false,表示進棧不成功;否則資料進棧,並返回true,表示進棧成功。為了方便操作,這裡使用頭插法,當然也可以使用雙向鍊錶的尾插法

bool

push

(liststack top,

int x)

首先判斷是否為空棧,如果棧空,則返回false,否則出棧,釋放空間,並返回true。

bool

pop(liststack top,

int*p)

//p指向的記憶體用來儲存出棧的元素的值

在實際應用中,有時需要同時使用兩個以上的棧,採用多個順序棧來處理很不方便,這時可以採用多鏈棧來處理。

多鏈棧是將多個鏈棧的棧頂指標放在乙個一維指標陣列中統一管理,從而實現同時管理和使用多個棧。

對多鏈棧的操作主要有進棧和出棧。進棧時要考慮進幾號棧,只要申請空間成功,就能入棧;出棧時要考慮是從幾號棧出棧,棧是否空,如果棧空,就不能出棧。

【演算法思想】

規定運算子的優先順序,然後開始讀表示式序列。

(1)若讀入的是空格,則認為是分隔符,無須處理。

(2)若讀入的是運算數,則直接輸出。

(3)若讀入的是左括號,則將其壓入堆疊中。

(4)若讀入的是右括號,則表明括號內的中綴表示式已經掃瞄完畢,將棧頂的運算子彈出並輸出,直到遇到左括號。最後左括號也出棧,但不輸出。

(5)當讀入的是運算子時:如果棧頂運算子優先順序「低於」當前運算子,則當前運算子進棧;否則,將棧頂的運算子彈出並輸出,重複這個步驟,直到棧頂運算子優先順序「低於」當前運

算符,最後將該運算子壓棧。

(6)若中綴表示式中的各物件處理完畢,則把堆疊中存留的運算子一一彈出並輸出。

例如:利用堆疊將中綴表示式「2*(9+6/3-5)+4」轉換成字尾表示式「2 9 6 3 / +

5 - * 4 +」的過程。

【程式實現】

#include

using

namespace std;

typedef

struct nodenode,

*liststack;

liststack creatstack (

)bool

push1

(liststack top,

char x)

bool

pop1

(liststack top,

char

*p)//p指向的記憶體用來儲存出棧的元素的值

//判斷棧頂的運算子與當前運算子的優先順序

intjdg

(char x,

char top)

//中綴表示式轉字尾表示式

char

*change

(char

*str)

}else

if(str[i]

=='+'

|| str[i]

=='-'

|| str[i]

=='*'

|| str[i]

=='/'

)push1

(top,str[i]);

p[j++]=

' ';}}

while

(top-

>next)

p[j]

='\0'

;return p;

}int

main()

【演算法思想】

//字尾表示式求值

/*輸入:6.5 + 6.5 / 2

輸出:9.75

*/double

cal(

char

*str)

else

if(str[i]

=='*'

|| str[i]

=='/'

|| str[i]

=='-'

|| str[i]

=='+'

) index--;}

}}return a[0]

;}

#include

using

namespace std;

typedef

struct nodenode,

*liststack;

liststack creatstack (

)bool

push1

(liststack top,

char x)

bool

pop1

(liststack top,

char

*p)//p指向的記憶體用來儲存出棧的元素的值

//判斷棧頂的運算子與當前運算子的優先順序

intjdg

(char x,

char top)

//中綴表示式轉字尾表示式

char

*change

(char

*str)

}else

if(str[i]

=='+'

|| str[i]

=='-'

|| str[i]

=='*'

|| str[i]

=='/'

)push1

(top,str[i]);

p[j++]=

' ';}}

while

(top-

>next)

p[j]

='\0'

;return p;

}//字尾表示式求值

double

cal(

char

*str)

else

if(str[i]

=='*'

|| str[i]

=='/'

|| str[i]

=='-'

|| str[i]

=='+'

) index--;}

}}return a[0]

;}intmain()

棧 中綴表示式轉字尾表示式

中綴轉字尾的演算法 遍歷中綴表示式中的數字和符號 對於數字 直接輸出 對於符號 左括號 進棧 運算符號 與棧頂符號進行優先比較 若棧頂符號優先順序低 此符號進棧 預設棧頂若是左括號,則左括號的優先順序最低 若棧頂符號優先順序高 將棧頂符號彈出 並輸出 直到棧頂的符號優先順序低,然後進棧 右括號 將棧...

中綴表示式轉字尾表示式 以及 字尾表示式求值

字尾表示式也叫逆波蘭表示式,其求值過程可以用到棧來輔助儲存。假定待求值的字尾表示式為 6 5 2 3 8 3 則其求值過程如下 1 遍歷表示式,遇到的數字首先放入棧中,此時棧如下所示 2 接著讀到 則彈出3和2,執行3 2,計算結果等於5,並將5壓入到棧中。3 讀到8,將其直接放入棧中。4 讀到 彈...

中綴表示式轉字尾表示式

using system using system.collections.generic using system.text namespace 中綴表示式轉字尾表示式 class convert public void run top break case case while top 1 st...