資料結構知識整理 - 鏈棧
阿新 • • 發佈:2018-12-30
主要內容
棧的定義
棧和佇列是兩種重要的線性結構,與一般線性表不同,它們是操作受限的特殊線性表,主要用於輔助其他資料結構的操作和處理,基本不用於儲存資料元素資訊。
棧(stack)是限定僅在表尾進行插入或刪除操作的線性表,即後進先出(Last In First Out,LIFO)。因此,對棧來說,表尾端有其特殊含義,稱為棧頂(top),相應地,表頭端稱為棧底(bottom)。不含元素的空表稱為空棧。
日常生活中有許多棧的例子。例如,盤子洗好從下往上疊,用的時候從上往下拿;貨物進倉從裡往外堆放,取貨的時候從外往裡取出等等。
在程式設計時,如果需要按照儲存資料時相反的順序來使用資料,則可以用棧來實現。例如,括號(字元)的巢狀,從裡往外巢狀,從外往裡求解;算術運算子的優先順序,按一定條件入棧和出棧運算等等。
鏈棧的儲存結構
鏈棧是指採用鏈式儲存結構實現的棧,通常採用單鏈表。
初始狀態時,棧底結點為空,即 LinkStack S == NULL; ,這同時也是判斷空棧的條件;
當插入新結點時,S指向新結點,新結點指向棧底結點,棧底結點依然為空。
typedef struct StackNode { Elemtype data; struct StackNode *next; } StackNode, *LinkStack;
鏈棧的各項操作
棧的主要操作是在棧頂插入和刪除元素,所以以連結串列的頭部作為棧頂(指標)最為合適。
初始化
構造空棧。
void InitStack(LinkStack &S)
{
S = NULL;
}
入棧
鏈棧在入棧前不需要判斷是否棧滿,只需要為入棧元素動態分配一個結點空間。
void Push(LinkStack &S, Elemtype e) { StackNode *p = new StackNode; p->data = e; p->next = S; S = p; }
出棧
鏈棧在出棧前同樣需要判斷是否空棧,而且還需要釋放出棧元素的空間。
Elemtype Pop(LinkStack &S, Elemtype &e)
{
if(S == NULL) exit(-1);
e = S->data;
StackNode *p = S; /*用p臨時儲存出棧結點的空間,以備釋放*/
S = S->next;
delete p; /*使用完出棧元素,可以釋放空間*/
return e; /*返回出棧元素資訊*/
}
取棧頂元素
棧非空,取元素,棧頂指標不變。
Elemtype GetTop(LinkStack S, Elemtype &e)
{
if(S != NULL)
return S->data;
}