棧與佇列 增 查 改 刪操作

2021-08-28 15:17:41 字數 3980 閱讀 5811

棧是一種只能在一端進行插入或刪除操作的線性表

其中允許進行插入或刪除操作的一端稱為棧頂(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 ...