資料結構(2) 棧和佇列

2021-10-07 11:29:04 字數 3838 閱讀 5797

棧的定義

基於棧的一些基本操作

#define maxsize 50

typedef struct sqstack;

2.順序棧上基本操作的實現

共享棧定義:鏈棧:採取鏈式儲存的棧結構,採用單鏈表來實現,並且限制所有的操作都只能在單鏈表的表頭進行;注意:規定鏈棧中沒有頭結點。

特點:可以使多個棧共享儲存空間;提高棧的效率;不存在棧滿上溢的情況

程式定義:

typedef struct linknode*linkstack;
基本操作的實現:插入、刪除操作等都與煉表相類似,但是要注意此處實現的鍊錶是沒有頭結點的,對於空表判斷,表頭元素的操作有特殊性。

bool push(linkstack &s,elemtype e)

bool pop(linkstack &s,elemtype &e)

佇列的定義

基於棧的一些基本操作

#define maxsize 50

typedef struct sqqueue;

2.順序棧上基本操作的實現

操作:

定義:鏈佇列:採取鏈式儲存的佇列結構,是乙個含有隊頭指標和隊尾指標的單鏈表。其中,隊頭指標指向隊頭節點,隊尾指標指向隊尾節點(注意:這一點與佇列的順序實現是不一樣的)。

特點:佇列的資料結構會有大量的資料變動的操作,用鏈式結構特別適合,且不存在佇列滿和溢位的情況,若程式中需要多個佇列和多個棧,那麼也可以考慮使用鏈式結構,避免儲存分配不合理+溢位。

程式定義:

typedef struct linknode;

typedef struct

基本操作的實現:插入、刪除操作等都與煉表相類似,但是要注意此處實現的鍊錶是沒有頭結點的,對於空表判斷,表頭元素的操作有特殊性。

//初始化

void initqueue(linkqueue &q)

//判隊空

bool isempty(linkqueue q)

//入隊,因為鏈棧無需判斷隊滿,所以返回型別可以是無值型

void enqueue(linkqueue &q,elemtype x)

//出隊

bool dequeue(linkqueue &q,elemtype &x)

bool bracketscheck

(char

*str)':

pop(s,e);if

(e!=

' i++;}

if(!isempty

(s))

else

}

佇列的應用多以一下三個形式展開:

①結合樹的結構,佇列在層次遍歷中的配合

「根節點入隊,如果隊空則結束遍歷,否則一直持續以下步驟:取出隊頭節點,先訪問該節點,依次將該節點的左右子節點入隊」

②佇列解決主機與外部裝置之間速度不匹配的問題

利用佇列構造乙個緩衝區

③佇列解決多使用者引起的資源競爭問題

構造乙個等待佇列,按照每個裝置請求的時間先後進行排序。

題目描述:汽車輪渡口,過江渡船每次載10輛車過江,過江車輛分為客車和火車,上渡船有以下規定:同類車先到先上船;客車先於貨車上船,且每上4輛客車,才允許放上一輛貨車;若等待的客車不足4輛,則以貨車代替;若無貨車等待,允許客車都上船。

**實現

陣列q表示渡船,容量為10;客車和貨車的隊列為q1和q2,;若q1充足,則取4個q1後再取1個q2,直到q的長度為10;若q1不充足,直接用q2對齊。

queue q;

queue q1,q2;

void

manager()

elseif(

1==4&&

!queueempty

(q2)

)else

i =0;

}if(queueempty

(q1)

&&queueempty

(q2)

) j =11;

//置1之後可跳出迴圈

}}

陣列:由n個相同型別的資料元素構成的有限序列,每個資料元素稱為乙個陣列元素,每個元素受到n個線性關係的約束,每個元素在n個線性關係中的序號稱為該元素的下標,並稱該元素為n維陣列。

陣列vs.線性表:陣列是線性表的推廣,一維陣列可以看做是乙個線性表;二維陣列可以看做元素是線性表的乙個線性表。陣列一旦被定義,維數和界數都不會再改變,陣列一般只有結構初始化、銷毀、元素訪問、元素修改的操作。

(1)一維陣列:

以一維陣列a[0…n-1]為例,其中每個元素佔據的儲存單元為l

l oc

(ai)

=loc

(a0)

+i∗l

(0≤i

<n)loc(a_i)=loc(a_0)+i * l (0≤i<n)

loc(ai

​)=l

oc(a

0​)+

i∗l(

0≤i<

n)(2)多維陣列:

按行優先的對映方式——先行後列,先儲存行號較小的元素,在行號相等的情況下再儲存列號較小的元素。

l oc

(aij

)=lo

c(ai

1i2)

+[(i

−i1)

∗(h2

−i2+

1)+(

j−i2

)]∗l

loc(aij)=loc(ai_1i_2)+[(i-i_1)*(h_2-i_2+1)+(j-i_2)]*l

loc(ai

j)=l

oc(a

i1​i

2​)+

[(i−

i1​)

∗(h2

​−i2

​+1)

+(j−

i2​)

]∗l按列優先的對映方式——先列後行,先儲存列號較小的元素,在列號相等的情況下,再儲存行號較小的元素。

l oc

(aij

)=lo

c(ai

1i2)

+[(j

−i2)

∗(h1

−i1)

+(i−

i1)]

∗lloc(aij)=loc(ai_1i_2)+[(j-i_2)*(h_1-i_1)+(i-i_1)]*l

loc(ai

j)=l

oc(a

i1​i

2​)+

[(j−

i2​)

∗(h1

​−i1

​)+(

i−i1

​)]∗

l壓縮儲存:對多個值相同的元素分配乙個儲存空間,對零元素不分配儲存空間

特殊矩陣:具有較多相同值或者零值的元素,且這些矩陣元素的空間分布具有一定的規律性

對稱矩陣

三角矩陣

三對角矩陣(帶狀矩陣)

稀疏矩陣:矩陣中的非零元素個數相對矩陣中元素的總個數而言非常少

稀疏矩陣的壓縮儲存:將非零元素的行標、列表以及值對應儲存下來,稀疏矩陣儲存後便失去了隨機訪問特性。

思維導圖

資料結構 (2)棧和佇列

資料結構 字串 棧 佇列 陣列 鍊錶 二叉樹 c 中stl常用的資料結構 string stack queue deque vector list map iterators 2 佇列 先進先出 push 向棧內壓入乙個成員 pop 從棧頂彈出乙個成員 empty 如果棧為空返回true,否則返回f...

資料結構 棧和佇列

棧 基礎 知識棧 練習題 佇列 基礎知識 棧示意圖 後進先出 順序棧結構定義 define maxsize 1024 struct stack 操作函式 push 入棧 pop 出棧 struct lstack 鏈棧示意圖 操作函式 push 入棧 pop 出棧 注意 也可以直接呼叫系統已經寫好的庫...

資料結構 棧和佇列

本章的基本內容是 兩種特殊的線性表 棧和佇列 從資料結構角度看,棧和佇列是操作受限的線性表,他們的邏輯結構相同。從抽象資料型別角度看,棧和佇列是兩種重要的抽象資料型別。p棧 限定僅在表的一端進行插入和刪除操作的線性表。p允許插入和刪除的一端稱為棧頂,另一端稱為棧底。p空棧 不含任何資料元素的棧。a ...