多鏈棧棧的應用:表示式求值
為了便於操作,採用帶頭結點的單鏈表實現棧,把鍊錶的頭指標作為棧頂指標。
採用鏈棧不必預先估計棧的最大容量,只要系統有可用的空間,鏈棧就不會出現溢位的情況。對於鏈棧,使用完畢後,應該釋放其空間。
鏈棧的各種基本操作的實現與單鏈表的操作類似。鏈棧分為一般鏈棧和多鏈棧。
一般鏈棧型別如下:
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...