下面來回顧一下
資料結構中比較常用的兩種型別:棧和佇列
棧:是乙個特殊的線性表,只能在一端操作,即先進後出
棧頂:允許操作的一端
棧底:不允許操作的一端
空棧:不含任何資料元素的棧,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...
棧和佇列 一
棧和佇列是兩種資料儲存型別,而之前說到的氣泡排序 選擇排序和插入排序是建立在陣列上的,而陣列是資料儲存結構。而棧和佇列更多的是作為程式設計師的工具來使用,它們主要作為構思演算法的輔助工具,而不是完全的資料儲存工具。並且,還存在受限訪問 只允許特定時刻只有乙個資料項執行操作 和更加抽象 主要通過介面對...