棧是一種只能在一端進行插入或刪除操作的線性表
其中允許進行插入或刪除操作的一端稱為棧頂(top)
棧頂由乙個棧頂指標的位置指示器(其實是1個變數,對於順序棧就是記錄棧頂元素所在陣列位置標號的乙個整型變數,對於鏈式棧就是記錄棧頂元素所在結點位址的指標)它是動態變換的。
表的另一端稱為棧底,棧底是固定不變的。
棧的插入和刪除操作一般稱為入棧和出棧。
特點:先進後出(filo)
儲存結構:順序棧和鏈式棧
棧是一種在操作上稍加限制的線性表,即棧的本質是線性表;
數學性質:
當n個元素以某種順序進棧,並且可在任意時刻出棧時,所獲得的元素排序的數目n恰好滿足函式
n =1
n+1c
2n
nn=\fracc_^
n=n+11
c2n
n棧空狀態:st.top == -1或st.top == 0
棧滿狀態:st.top ==maxsize -1
因為陣列下標從0開始,maxsize -1 為棧滿時,棧頂元素在陣列中的位置
上溢:棧滿繼續入棧
下溢:棧空的時候繼續出棧所造成的
元素x進棧操作:
++(st.top);
st.data[st.top]
=x ;
必須先移動指標,再進入元素
元素x出棧操作:
x = st.data[st.top];--
(st.top)
;
1) 定義棧typedef
struct
sqstack;
2) 初始化棧void
initstack
( sqstack &st)
3) 判斷棧空int
isempty
(sqstack st)
4) 進棧int
push
(sqstack &st ,
int x)
5) 出棧int
pop(sqstack &st ,
int&x)
6) 簡化操作//定義並初始化
int stack[maxsize]
;int top =-1
;//元素x進棧
stack[
++top]
== x;
//元素x出棧
x = stack[top--
];
棧空狀態:lst->next == null;
棧滿狀態:不存在棧滿狀態
元素進棧(由p指標所指)
p->next = lst->next;
lst->next = p
元素出棧(出棧元素儲存在x中)
p = last->next;
x = p->data;
lst->next = p->next;
free
(p)
1) 鏈棧結點定義typedef
struct lnode
lnode;
2) 初始化鏈棧void
initstack
(lnode *
&lst)
3) 判斷棧空int
isempty
(lnode *lst)
4) 進棧(頭插法)void
push
(lnode *lst ,
int x)
5) 出棧int
pop(lnode *lst ,
int&x)
定義:佇列是一種操作受限的線性表, 其限制為僅允許在標的一端進行插入,在表的另一端刪除, 可進行插入的一端稱為隊尾,可進行刪除的一端稱為隊頭; 向佇列中插入元素稱為進隊,新元素進隊後就成為新的隊尾元素; 從佇列中刪除元素稱為出隊,其後繼元素就成為新的隊頭元素。
假溢位問題:
隊尾指標rear -> 剛進隊元素位置
隊首指標fort -> 剛出隊元素位置
進隊時 rear 向後移動
出隊時 fort 向後移動
這樣進過一系列的出隊和進隊操作之後,兩個指標最終會到達陣列末端,maxsize-1處,隊中沒有元素,但仍然無法進隊,這就是「假溢位問題」
解決辦法:
將陣列組成乙個環,讓rear和fort沿著環走,這樣就產生了迴圈佇列,可以通過執行語句 fort = (fort +1)%maxsize 實現環形道路走。
隊滿:
(rear+1)
%maxsize == fort :
(qu.rear+1)
%maxsize == qu.fort
隊空:
fort == rear
元素x進隊(移動隊尾指標):元素入隊時,先移動指標,後存入元素
qu.rear =
(qu.rear +1)
%maxsize;
qu.data[qu.rear]
= x;
元素x出隊(移動隊首指標):元素出隊時,先移動指標,再取出元素
qu.fort =
(qu.fort +1)
%maxsize;
x = qu.data[qu.fort]
;
1) 初始化佇列void
initqueue
(sqqueue &qu)
2) 判斷隊空init isqueueempty
(sqqueue qu)
3) 進隊演算法init enqueue
(sqqueue &qu ,
int x)
4) 出隊演算法int
dequeue
(sqqueue &qu ,
int&x)
鏈隊就是採用鏈式儲存結構儲存佇列(這裡採用單鏈表實現)
lqu->rear->next = p;
lqu->rear = p;
元素出隊操作:(假設x儲存出隊元素)
p = lqu->fort;
lqu->fort = p->next;
x = p->data;
free
(p);
1) 鏈隊型別定義typedef
struct
liqueue;
2) 初始化鏈隊void
initqueue
(liqueue *
&lqu)
3) 判斷隊空int
isqueueempty
(liqueue *lqu)
4) 入隊演算法void
enqueue
(liqueue *lqu ,
int x)
}
5) 出隊演算法int
dequeue
(liqueue *lqu ,
int&x)
棧與佇列基本操作
想了下,上學期學的資料結構線性結構還有些混亂的地方,想做一點注意事項的總結。1.鍊錶 2.棧順序棧 定義乙個陣列 可以是陣列形式的data 或指標形式的 data,若是指標形式就 需要在結構體中加乙個變數maxsize存放陣列的最大容量 和棧頂指標 在順序棧中就是 陣列下標 棧頂指標存放棧頂元素,初...
棧與佇列操作總結
c 有棧和佇列的函式 include include queue int q 定義int型別為例 stack int s stack 堆疊 是乙個容器類的改編,提供了堆疊的全部功能,也就是說實現了乙個先進後出 filo 的資料結構。操作比較和分配堆疊 empty 堆疊為空則返回真 pop 移除棧頂元...
棧與佇列基本操作
include include typedef struct lnodelnode,linklist 頭插法 linklist create list head int n return head 尾插法 linklist create list tail int n else tail next ...