1. 程式人生 > >資料結構學習筆記9--棧和佇列的順序儲存結構

資料結構學習筆記9--棧和佇列的順序儲存結構

棧和佇列的相同點和不同點

相同點:棧和佇列是兩種重要的資料結構,也是兩種特殊的線性表結構。從資料的邏輯角度看,棧和佇列是線性表;從操作的角度來看,棧和佇列的基本操作是線性表基本操作的子集,是操作受限制的線性表。

不同點:棧是限定僅在表尾進行插入刪除的線性表,它的存其特徵是後進先出;佇列是限定只允許在表的一端進行插入,而在另一端進行刪除元素的線性表,它的存取特徵是先進先出。

棧的順序儲存表示與實現:棧的順序儲存又稱順序棧,它是利用一組地址連續的儲存單元一次性存放自棧底到棧頂的資料元素,同時附設指標top指示棧頂元素在順序棧的位置。(要設定一個指標是因為棧是在棧頂進行插入刪除操作)

#define StackSize<順序棧的容量>
typedef struct snode{
      ElemType data[StackSize]
      int top;}snode;
其中,snode相當於一個棧,data[i]存放第i個元素。初始化時,top賦值為-1.

佇列的順序儲存表示與實現:與棧一樣,佇列的順序儲存指的是利用一組地址連續的儲存單元存放佇列中的元素,並設定兩個分別指示隊頭元素的儲存位置和隊尾元素的儲存位置的變數front,rear,分別稱為隊頭指標和隊尾指標。(要設定兩個指標是因為要在隊尾進行插入操作,而在隊頭進行刪除操作)

順序佇列的型別變數定義如下:

#define QueueSize<順序佇列的容量>
typedef struct qnode{
      ElemType data[QueueSize]
      int front,rear;}qnode;
初始化時,front和rear均賦值為-1.

假溢位:當rear=QueueSize-1時,佇列為滿,如果再加入新元素,就會產生溢位。但是這種溢位不是真正的溢位,在陣列的前端可能還有空位置(刪除操作),所以這是一種假溢位。

為了解決順序佇列中的“假溢位”問題,需要把陣列想象成為一個首尾相接的環,稱這種陣列為“迴圈陣列”,儲存在其中的佇列稱為“迴圈佇列”。

解決隊滿,隊空的判斷問題有3種方法:

1.設定一個布林變數以區別隊滿還是隊空。

2.浪費一個元素的空間,用於區分隊滿還是隊空。

3.是用一個計數器記錄佇列中的元素個數。(即佇列長度)

在使用中,大多采用第2種方法,即隊頭、隊尾指標中有一個指向元素,而另一個指向空元素。

通常約定隊尾指標指示隊尾元素在一維陣列中的當前位置,隊頭指標指示在一維陣列中的當前位置的前一個位置。