只允許在一端進行插入或刪除操作的線性表。首先,棧是一種線性表,但限定這種線性表只能在某一段進行插入和刪除操作。
棧頂(top):線性表允許進行插入和刪除的一端。
棧底(bottom):固定的,不允許進行插入和刪除的另一端。
空棧:不含任何元素。
如上圖:a1為棧底元素,an為棧頂元素。由於棧只能在棧頂進行插入和刪除操作,故進棧次序依次為a1,a2,… ,an 而出棧次序為an,…,a2,a1。棧的明顯的操作特徵為後進先出(last in first out,lifo),故又稱 後進先出的線性表。
1)initstack(s):初始化空棧s
2)stackempty(s):判斷乙個棧是否為空
3)push(&s,x):進棧,若棧未滿,則將x加入使之成為新棧頂
4)pop(&s,&x):出棧,若棧非空,則將棧頂元素,並用x返回
5)gettop(s,&x):讀棧頂元素,若棧頂元素非空,則用x返回棧頂元素
6)destroystack(&s):銷毀棧,並釋放棧s占用的儲存空間
棧的順序儲存型別可以用以下表示:
#define maxsize 100
//棧中元素的最大個數
typedef
struct
sqstack;
棧頂指標:s.top,初始時設定s.top = -1;棧頂元素:s.data[s.top];
進棧操作:棧不滿時,棧指標加1,再送值到棧頂元素
出棧操作:棧非空時,先去棧頂元素值,再將棧頂指標減1
棧空條件:s.top == -1
棧滿條件:s.top == maxsize - 1
棧長:s.top + 1
初始化
void
initstack
(sqstack& s)
判棧空bool
stackempty
(sqstack& s)
return
false
;}
進棧bool
push
(sqstack& s, elemtype x)
s.top ++
;//棧頂指標加1
s.data[s.top]
= x;
//入棧
return
true
;}
出棧bool
pop(sqstack& s, elemtype& x)
x = s.data[s.top]
; s.top --
;return
true
;}
讀棧頂元素bool
gettop
(sqstack& s,elemtype& x)
x = s.data[s.top]
;return
true
;}
注意:若棧頂指標初始化為s.top = 0,即棧頂指標指向棧頂元素的下乙個位置,則入棧操作變為s.data[s.top++],出棧操作為x = s.data[–s.top]。因為棧頂指標若初始化為 0 時,則棧頂指標始終指向順序棧將要入棧的位置,也就是棧頂指標的下標就是入棧元素的下標。
利用棧底位置相對不變的特性,可以讓兩個順序棧共享乙個一維資料空間,將兩個棧的棧底分別設定在共享空間的兩端,兩個棧頂向共享空間的中間延伸。
兩個棧的棧頂指標都指向棧頂元素,top1 = -1 時,stack1 為空,top2 = maxsize - 1 時,stack2 為空;僅當兩個棧頂指標相鄰(top1 - top2 == 1)時,判斷棧滿。當stack1進棧時top1先加1再賦值,stack2進棧時top2先減1再賦值;出棧正好相反。
共享棧是為了更有效地利用儲存空間,兩個棧的空間正好互相調節,只有在整個儲存空間被佔滿時才發生上溢。訪問資料的時間複雜度均為o(1),所以對訪問效率沒有什麼影響。
採用鏈式儲存的棧稱為鏈棧,鏈棧的優點是便於多個棧共享儲存空間和提高其效率,且不存在棧滿上溢的情況。通常採用單鏈表實現,並規定所有操作都是在單鏈表的表頭進行的。這裡規定鏈棧沒有頭結點,top指向棧頂元素,
鏈棧的儲存型別可描述為:
typedef
struct linknodelinknode,
*linkstack;
如果喜歡的話,不妨關注一波,謝謝啦。
資料結構 棧stack
棧的概念與資料結構 棧 有時稱為 後進先出棧 是乙個元素的有序集合,其中新增移除新元素總發生在同一端。這一端通常稱為 頂部 與頂部對應的端稱為 底部 棧的底部很重要,因為在棧中靠近底部的元素是儲存時間最長的。最近新增的元素是最先會被移除的。這種排序原則有時被稱為 lifo,後進先出。它基於在集合內的...
資料結構 棧(Stack)
棧 英語 stack 又稱為堆疊或堆疊,棧作為一種資料結構,它按照先進後出的原則儲存資料,先進入的資料被壓入棧底,最後的資料在棧頂,需要讀資料的時候從棧頂開始彈出資料 最後乙個資料被第乙個讀出來 由於堆疊資料結構只允許在一端進行操作,因而按照後進先出 lifo last in first out 的...
《資料結構》 棧Stack
一.棧stack 先進後出 filo 1.棧的主要功能是進行資料的儲存和計算 棧是一種容器 是具有特殊限制的鍊錶或陣列 2.棧的儲存方式 順序儲存 陣列 空間固定 所以需要預先知道所需要開闢的空間有多大 陣列難以進行擴容 所以導致可用空間是有限的 鏈式儲存 鍊錶 棧可以理解為鍊錶的頭插頭刪 這種儲存...