線性表二 棧和佇列

2021-10-05 21:57:50 字數 2972 閱讀 4138

1.棧

棧是一種只能在其一端訪問資料的線性表,這種操作方法決定了它的乙個特點:先進後出,後進先出,你可以把它想象為生活中任意乙個只有乙個口的容器,你只有把後邊放進去的東西拿出來之後才能去取之前放進去的東西,棧訪問資料的一端被稱為棧頂.

2.佇列

佇列是在其一端插入資料、在另一端取出資料的線性表,它的特點是先進先出,就好似現實中的排隊一樣,先到的先辦完事情出隊,佇列插入資料的一端被稱為尾,刪除資料的一端被稱為隊首. //棧

1、順序棧

順序棧就相當於用陣列儲存資料,top記錄棧頂元素或者其上乙個空間的下標,入棧和出棧**如下。

//順序棧的結構

struct stack

stack;

//入棧

stack.data[stack.top]

= value;

stack.top++

;

//出棧

stack.top--

;stack.data[stack.top]=0

;

這裡入棧和出棧在某種意義上可以說是逆序,其原因可以自己畫圖理解。

2、鏈棧

鏈棧在節點組織上有如下兩種方式:

這兩種方式我們選第一種,因為第二種方式得維護乙個棧低指標,並且在每一次出棧時都必須從棧底遍歷一遍整個棧以便找到指向棧頂節點的節點, 才能刪除棧頂元素。用第一種組織結構出棧入棧方法如下:

//鏈棧結構

typedef

struct stacknode

stacknode;

typedef

struct stack

stack;

//入棧

stacknode *p =

(stacknode *

)malloc

(sizeof

(stacknode));

p->data = value;

p->link = stack.top;

stack.top = p;

//出棧

stacknode *p = stack.top;

stack.top = stack.top->link;

free

(p);

//佇列

1、順序佇列

用陣列儲存的佇列有乙個缺點,在出隊的時候,把第乙個元素刪除,那就得把後邊所有元素向前挪乙個位置,浪費時間,解決的辦法是出隊不挪元素,我們讓隊首下標加一就行,但是這又有乙個致命的缺點,隨著入隊出隊的次數越來越多,陣列空間越來越大,但是隊首之前卻又大片空間被閒置著,造成了空間上的浪費。那麼最終的解決辦法就是迴圈佇列,在邏輯意義上將陣列的尾部和首部連線起來形成乙個環,這樣在入隊時雖然尾部滿了,但是如果隊首有空間,依然會成功插入,要想實現這一點,我們得依賴取模運算子%,**如下:

//順序隊結構

struct queue

queue;

//判空

queue.head == queue.tail;

//判滿

(queue.tail +1)

%(queue.capacity +1)

== queue.head;

//入隊,不考慮隊滿的情況

queue.tail = value;

queue.tail =

(queue.tail +1)

%(queue.capacity +

1)

//出隊,不考慮隊空的情況

queue.head =0;

queue.head =

(queue.head +1)

%(queue.capacity +

1)

對capacity+1取模得到的是0~capacity,剛好滿足要求。

2、鏈隊

這裡也就沒什麼好說的了,直接給出**:

//鏈隊的結構

typedef

struct queuenode

queuenode;

typedef

struct queue

queue;

//入隊

queuenode *p =

(queuenode *

)malloc

(sizeof

(queue));

p->data = value;

p->link =

null

;queue.tail->link = p;

queue.tail = p;

//出隊

queuenode *p = queue.head;

queue.head = queue.head->link;

free

(p);

我認為這可以是用於學習,開發思維,但好像沒什麼用,用棧我建乙個棧就行了,為什麼非要搞兩個佇列來弄,浪費時間又浪費空間,沒道理。所以我這裡只總結一下原理吧。

用棧實現佇列就是建兩個棧,乙個作為存資料的棧,乙個作為輔助棧,入隊時直接往資料棧壓棧就行,主要是出隊,因為棧不允許從棧低取資料,所以需要先把上邊n-1個資料出棧,出到哪呢,總不能扔了吧,這時候就要用到輔助棧了,把資料從資料棧中取出,入到輔助棧中,取出想要的資料,也就是出隊,然後再來個反過程,將資料再倒回去,因為棧操作方式是一樣的,所以資料倒回去之後順序沒變。

用佇列實現棧也是這麼個原理,大家可以自己揣摩揣摩!!!

線性表 棧和佇列

線性表是n個元素的有限序列。表示方法有兩種,一種是順序表示,一種是鏈式表示。順序表示即採用一組位址連續的儲存單元依次儲存線性表的資料元素,通常採用陣列來實現 鏈式表示是用一組任意的儲存單元儲存線性表的資料元素,每一結點包含兩個域 資料域和指標域,資料域儲存資料,指標域儲存後繼儲存位址資訊,實現為 i...

線性表 棧和佇列

一 線性表 list 1 定義 有序 有限的資料序列,其中的每個資料稱為元素 element 2 基本概念 空 empty 長度 length 頭 head 尾 tail 有序表 sorted list 無序表 unsorted list 3 基本操作 初始化 插入 刪除 訪問 修改 4 用抽象類 ...

線性表 棧 佇列

輔助定義 define maxsize 5 define ok 0 define error 1 typedef int selemtype typedef int status 棧 順序 鏈式 相關結構體定義 順序棧 typedef struct sqstack 順序棧共享空間 typedef s...