回顧一下 棧和佇列

2021-08-15 22:04:26 字數 2772 閱讀 1834

下面來回顧一下

資料結構中比較常用的兩種型別:棧和佇列

棧:是乙個特殊的線性表,只能在一端操作,即先進後出

棧頂:允許操作的一端

棧底:不允許操作的一端

空棧:不含任何資料元素的棧,top = -1,當棧中有乙個元素時,top = 0;

一、順序儲存(一般採用迴圈佇列)

順序儲存中,我們通常用陣列下標表示結點的位置,因此當 top 為 0 時,並不表示該棧為空,而

表示含有乙個結點;

所以在初始化的時候,將 top = -1;

順序棧的定義:

typedef  struct sqstackstack;
棧最重要的操作就是出棧和入棧了

首先是進棧:

int push(stack *s, int e)

其次是出棧:

int pop(stack *s, int *e)

二、棧的鏈式儲存(鏈棧)

棧頂放在單鏈表的頭部;鏈棧是不需要頭結點的;鏈棧不存在棧滿的情況

順序棧的內存在宣告順序表時就已經分配好了,而鏈棧的結點在使用時,

利用 malloc 分配就行了

鏈棧的定義:

struct node

;typedef struct node node;

typedef node * linknode;

struct stack

;

進棧:棧是先進後出的資料結構,只能在棧頂進行操作,所以剛進入的結點要和 top 建立聯絡

**如下:

int push(linkstack *s, int e)

p->data = e;

p->next = s->top;

s->top = p;

s->count++;

return ok;

}

出棧:出棧的話首先要定義變數來儲存要刪除的棧頂指標,其次將棧頂指標指向下乙個結點,最後釋放變數

**如下:

int pop(linkstack *s, int *e)

佇列:隊頭(front)取出資料的一端

隊尾(rear)放入資料的一端

佇列也分為順序佇列和鏈式佇列

迴圈佇列:

一般規定 front 指標指向隊頭元素,rear指標指向隊尾元素的下乙個位置(避免只出現乙個元素

隊頭和隊尾的重合處理麻煩),這樣當 front 等於 rear的時候,就表示該隊列為空佇列

rear指標指向隊尾元素的下乙個位置,當佇列滿時,這時會出現假溢位的現象,所以對於乙個容量

為 maxsize 的佇列,最多只能存放 maxsize-1 個元素,為了解決這個問題,通常採用迴圈佇列

迴圈佇列通俗點說就是頭尾相接的佇列,所以這種情況下,rear 也會出現在 front 的前面,當隊滿

再插入乙個元素時,原先隊頭元素出隊,此時 front 會向後移,而 rear 就在 front 前面

如何判斷隊滿和求該佇列的長度

有兩個公式:

判斷隊滿:(rear+1)% maxsize == front

求佇列長度:(rear-front+maxsize)% maxsize 

這裡的 rear 和 front 都是陣列的下標

迴圈佇列定義:

typedef  struct sqqueue;

迴圈佇列初始化:

int initqueue(sqqueue *q)

迴圈隊列入隊:

int enqueue(sqqueue *q, int e)

迴圈佇列出隊:

int dequeue(sqqueue *q, int *e)

鏈式佇列:

佇列的鏈式儲存結構,其實就是線性表的單鏈表,只是它只能從尾進隊,從頭出隊

一般我們將隊頭指標指向鏈佇列的頭結點,而將隊尾指標指向尾結點

鏈式佇列定義:

struct node

;typedef struct node *node;

struct queue

;typedef struct queue linkqueue;

鏈式佇列進隊:

int enqueue(linkqueue *q, int e)

s->data = e;

s->next = null;

q->rear->next = s;

q->rear = s;

return ok;

}

鏈式佇列出隊

int dequeue(linkqueue *q, int *e)

q->front->next = p->next;

*e = p->data;

free(p);

if (q->front->next == null)

return ok;

}

好了,關於棧和佇列的介紹就到這了(不是很全),下次再見!

回顧一下這段時間

自從小兒子出生以來,每天睡眠不好,加上年底雜事比較多,好久沒有看專業書籍,也沒有寫部落格了。這是病,得改,任何事情都貴在堅持。最近對專案管理和質量管理進行了一些實操性質的研究,實際就是考慮怎麼把規範 標準 體系的要求落實到具體的日常工作中去。下面是一些老生常談 1 流程要梳理清晰。各項工作用的表單,...

getopt 簡單回顧一下

getopt 解析命令的可選項 說明 getopt只是乙個簡單的解析命令可選項的函式,只能進行簡單的格式命令解析,格式如下 1 形如 cmd a b 對短選項的解析 2 形如 cmd a a argument b b argument 對短選項及短選項的引數解析 3 形如 cmd a a argum...

棧和佇列 一

棧和佇列是兩種資料儲存型別,而之前說到的氣泡排序 選擇排序和插入排序是建立在陣列上的,而陣列是資料儲存結構。而棧和佇列更多的是作為程式設計師的工具來使用,它們主要作為構思演算法的輔助工具,而不是完全的資料儲存工具。並且,還存在受限訪問 只允許特定時刻只有乙個資料項執行操作 和更加抽象 主要通過介面對...