大話資料結構筆記_佇列
- 定義 : 只允許在一端進行插入操作, 而在另一端進行刪除操作的線性表。 是一種FIFO的線性表。
- 順序結構, 避免陣列移動 , 和頭指標前面空間的浪費, 使用迴圈佇列
- 迴圈佇列判斷 空佇列 和 佇列滿的兩種方法
- 1.增加falg標記
- 2.在滿時候 rear 和 front 之間空一個元素。
- 滿的時候 : (rear + 1 ) % MAXSIZE == front
- 空的時候 : front == rear
- 佇列的長度 : (rear - front + MAXSIZE) % MAXSIZE
- 順序結構 和 鏈式結構的比較: 看最後;
佇列的ADT: |
ADT Queue
Data:
同線性表。元素具有相同的型別, 相鄰的元素具有前驅 和 後繼關係
Operations:
InitQueue(*Q) : 初始化操作, 建立一個空的佇列Q。 |
- 使用一個標誌flag , 未滿時為0 , 滿時候為1
- 在front 和 rear 之間留一個空位
- 當(rear+1) % QueueSize == front 時候為滿, 否則為不滿
迴圈佇列結構體定義 和 介面宣告 檔名 : SqQueue.h |
/***************************************************************************** File name: SqQueue.h Description: 迴圈佇列的結構體的定義和操作介面宣告 Author: MusaGeek Version: 1.0 Date: 2018-11-26 *****************************************************************************/ #ifndef __SQQUEUE_H #define __SQQUEUE_H #define MAXSIZE 20 #define FALSE 0 #define TRUE 1 typedef int QElemType; typedef int BOOL; typedef unsigned int uint; /*迴圈佇列的結構體*/ typedef struct { QElemType data[MAXSIZE]; /*順序結構*/ int front; /*頭指標*/ int rear; /*尾巴指標*/ }SqQueue; /*部分介面宣告*/ extern BOOL InitQueue(SqQueue *Q); extern uint QueueLength(SqQueue Q); extern BOOL EnQueue(SqQueue *Q, QElemType e); extern BOOL DeQueue(SqQueue *Q, QElemType *e); #endif |
迴圈佇列的操作實現: 檔名 : SqQueue.c |
說明 : 內部只有部分關鍵操作的實現 , 其他操縱的實現省略 |
/****************************************************** File name: SqQueue.c Description: 迴圈佇列的操作的實現 Author: MusaGeek Version: 1.0 Date: 2018-11-26 Function List: ******************************************************/ #include <stdio.h> #include "SqQueue.h" /************************************************* Function: InitQueue Description: 初始化迴圈佇列的頭指標 和 尾指標 為0 Input: Q : 指向順序佇列的指標 Return: BOOL TRUE : 初始化成功 *************************************************/ BOOL InitQueue(SqQueue *Q) { Q->front = 0; Q->rear = 0; return TRUE; } /************************************************* Function: QueueLength Description: 獲取佇列的長度 公式 : (rear - front + MAXSIZE) % MAXSIZE; Input: Q : 迴圈佇列的拷貝 Return: 迴圈佇列的長度 uint -> unsigned int *************************************************/ uint QueueLength(SqQueue Q) { reuturn (Q.rear - Q.front + MAXSIZE) % MAXSIZE; } /************************************************* Function: EnQueue Description: 若佇列未滿則插入元素 1.判斷佇列未滿否 , 否 返回FALSE 2.在rear指標處放置元素 3.rear 指標向後移動 4.返回TRUE 判斷滿的公式: 若 (rear + 1) % MAXSIZE == front 滿 Input: Q : 指向迴圈佇列的指標 e : 插入的元素 Return: BOOL TRUE:插入成功 FALSE:插入失敗 *************************************************/ BOOL EnQueue(SqQueue *Q, QElemType e) { if((Q->rear + 1) % MAXSIZE == Q->front) /*判斷佇列滿否*/ return FALSE; Q->data[Q->rear] = e; Q->rear = (Q->rear + 1) % MAXSIZE; return TRUE; } /************************************************* Function: DeQueue Description: 頭指標指向的元素出佇列 1.判斷佇列為空否 : 空則返回FALSE 2.將front 指標指向的元素通過e傳出 3.front 指標向後移動 4.return TRUE Input: Q : 迴圈佇列的拷貝 Output: e : 傳出引數 , 頭指標指向的元素 Return: BOOL TRUE : 出佇列成功 FALSE : 出佇列失敗 *************************************************/ BOOL DeQueue(SqQueue *Q, QElemType *e) { if(Q->rear == Q->front) /*佇列為空*/ return FALSE; *e = Q->data[Q->front]; Q->front = (Q->front + 1) % MAXSIZE; /*頭指標向後移動*/ return TRUE; } |
鏈式佇列結構體定義 和 介面宣告 檔名 : LInkQueue.h |
/***************************************************************************** File name: LinkQueue.h Description: 鏈式儲存佇列的結構體的定義和操作介面宣告 Author: MusaGeek Version: 1.0 Date: 2018-11-26 *****************************************************************************/ #ifndef __LINKQUQUE_H #define __LINKQUQUE_H #define TRUE 1 #define FALSE 0 typedef int QElemType; /*假設佇列儲存的型別是int*/ typedef int BOOL; typedef unsigned int uint; /*鏈式儲存中的結點結構*/ typedef struct QNode { QElemType data; struct QNode *next; }QNode, *QueuePtr; /*佇列的鏈式結構*/ typedef struct { QueuePtr front, rear; /*隊頭, 隊尾指標*/ }LinkQueue; /*部分介面說明*/ extern BOOL EnQueue(LinkQueue *Q, QElemType e); extern BOOL DeQueue(LinkQueue *Q, QElemType *e); extern BOOL InitQueue(LinkQueue *Q); #endif |
鏈式佇列操作的實現 檔名 : LInkQueue.c |
說明 : 內部只有部分關鍵操作的實現 , 其他操縱的實現省略 |
/****************************************************** File name: LinkQueue.c Description: 佇列鏈式儲存的操作的實現 Author: MusaGeek Version: 1.0 Date: 2018-11-26 Function List: ******************************************************/ #include <stdio.h> #include <stdlib.h> #include "LinkQueue.h" /************************************************* Function: InitQueue Description: 初始化鏈式佇列 建立連結串列的頭結點 , 將front 和 rear 均指向頭結點。 Input: Q: 指向鏈式佇列的指標 Return: BOOL TRUE : 初始化成功 FALSE : 初始化失敗 *************************************************/ BOOL InitQueue(LinkQueue *Q) { Q->front = (QueuePtr)malloc(sizeof(QNode)); if(!Q->front) return FALSE; Q->front->next = NULL; Q->rear = Q->front; } /************************************************* Function: EnQueue Description: 將元素插入佇列 1.建立一個新結點 , 將e 賦值給結點的data 2.將建立的結點增加的連結串列的尾部 3.尾指標指向建立的結點 4.返回TRUE Input: Q: 指向鏈式佇列的指標 Return: BOOL TRUE : 插入成功 FALSE : 插入失敗 *************************************************/ BOOL EnQueue(LinkQueue *Q, QElemType e) { QueuePtr node = (QueuePtr)malloc(sizeof(QNode)); if(!node) return FALSE; node->data = e; node->next = NULL; Q->rear->next = node; /*將node結點插入連結串列尾部*/ Q->rear = node; /*將尾指標指向node*/ return TRUE; } /************************************************* Function: DeQueue Description: 頭元素出佇列 1.判斷佇列是否為空 , 為空 返回 FALSE 2.將頭結點的 next 指向存放首元素的結點node的下一個結點 3.node結點的data通過e傳出 4.若rear為node , 說明刪除node以後佇列為空 , 應該將rear 指向 front 5.釋放node 6.返回TRUE Input: Q: 指向鏈式佇列的指標 Output: e : 通過e傳出首元素的值 Return: BOOL TRUE : 出佇列成功 FALSE : 出佇列失敗 *************************************************/ BOOL DeQueue(LinkQueue *Q, QElemType *e) { if(Q->front == Q->rear) /*判斷佇列是否為空*/ return FALSE; QueuePtr node = Q->front->next; Q->front->next = node->next; /*從佇列中刪除node結點*/ if(Q->rear == node) /*判斷是否佇列刪除node以後為空佇列*/ Q->rear = Q->front; /*若為空佇列,rear 指標 指向 front 指標指向的位置*/ *e = node->data; /*node結點的值傳出, 完成出佇列操作*/ free(node); return TRUE; } |
相關推薦
大話資料結構筆記_佇列
總結: 定義 : 只允許在一端進行插入操作, 而在另一端進行刪除操作的線性表。 是一種FIFO的線性表。 順序結構, 避免陣列移動 , 和頭指標前面空間的浪費, 使用迴圈佇列 迴圈佇列判斷 空佇列 和 佇列滿的兩種方法 1.增加falg標記 2.在滿時候 rear 和
大話資料結構筆記_線性表
線性表的定義 : 簡而言之 : 0 個 或 多個元素(型別相同)的有限序列( 有順序 ) , 第一個元素無前驅 , 最後一個元素無後繼 , 其他元素 與有唯一的前驅 和 唯一的後繼 數學語言定義 : 若將線性表記為 ( a1 , a2 , ..... , ai - 1 , ai , ai+1 , ..
大話資料結構筆記_串
串的定義: 串(string)是由零個或者多個字元組成的有限序列, 又名叫字串。 串的比較: 字典序 串的ADT:
資料結構筆記_棧和佇列
一. 棧(Stack) 棧的認識: 棧是一種線性結構; 相比陣列,棧對應的操作是陣列的子集; 只能從一端新增元素,也只能從一端取出元素,這一端稱為棧頂; 棧是一種後進先出的資料結構(Last In First Out:LIFO); 棧看似
《大話資料結構4》—— 佇列的順序儲存結構 (迴圈佇列)—— C++程式碼實現
佇列 ● 佇列的概念: 佇列(簡稱作隊,Queue)也是一種特殊的線性表,佇列的資料元素以及資料元素間的邏輯關係和線性表完全相同,其差別是線性表允許在任意位置插入和刪除,而佇列只允許在其一端進行插入操作在其另一端進行刪除操作。 佇
《大話資料結構5》—— 佇列的鏈式儲存結構 —— C++程式碼實現
目錄 鏈佇列 迴圈佇列和鏈式佇列的比較 鏈佇列 ● 實現佇列的最好的方式就是使用單鏈表來實現,佇列的鏈式儲存結構,其實就是線性表的單鏈表,只不過它只能尾進頭出而已——稱為鏈佇列。 ● 那為了操作方便,頭指標指向頭結點,隊尾指標指向終端節點,即最後一個結點元
資料結構筆記_動態陣列的實現
public class Array<E> { private E[] data; private int size; public Array(int capacity){ data = (E[])new Object[capacity];
大話資料結構筆記之--緒論及演算法
一.資料結構緒論 資料結構含義:是相互之間存在一種或多種特定關係的資料元素的集合 1,資料結構起源 1)資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及他們之間的關係和操作等相關問題的學科。 2)程式設計的實質是對確定的問題選擇一種好
資料結構 筆記:佇列的概念及實現(上)
佇列是一種特殊的線性表 佇列僅能線上性表的兩端進行操作 -隊頭(Front):取出資料元素的一端 -隊尾(Rear):插入資料元素的一端 佇列的特性 -先進先出 佇列的操作 -建立佇列 -銷燬佇列(Queue()) -清空佇列(~Queue()) -進佇列
資料結構筆記_連結串列
一.連結串列 線性資料結構: 動態陣列 棧 佇列 以上三種資料結構的底層均是依託於靜態陣列,解決自動變容問題靠的是reSize操作。 連結串列的認識: 是線性資料結構 是一種真正的動態資
大話資料結構筆記-串
操作Index的實現演算法 /*T為非空串、若主串S中第pos個字元之後存在與T相等的子串, 則返回第一個這樣的子串在S中的位置,否則返回0 */ int Index(String s,String T,int pos) { int n,m,i; String sub; if
大話資料結構九:佇列的鏈式儲存結構(鏈佇列)
1. 鏈佇列的特點: 鏈佇列其實就是單鏈表,只不過它是先進先出的單鏈表,為了實現方便,程式中設定了隊頭(front),隊尾(rear)兩個指標。 2. Java使用連結串列實現佇列: //結點類,包含結點的資料和指向下一個節點的引用 public class N
【大話資料結構】04 棧與佇列 筆記
《大話資料結構》 ——程傑 共463頁 筆記圈點主要內容,也請多多支援大話資料結構該書作者。 第 4 章 棧與佇列 111頁_定義 棧是限定在表尾進行插入和刪除操作的線性表。 佇列是隻允
大話資料結構讀書筆記艾提拉總結 查詢演算法 和排序演算法比較好 第1章資料結構緒論 1 第2章演算法 17 第3章線性表 41 第4章棧與佇列 87 第5章串 123 第6章樹 149 第7章圖 21
大話資料結構讀書筆記艾提拉總結 查詢演算法 和排序演算法比較好 第1章資料結構緒論 1 第2章演算法 17 第3章線性表 41 第4章棧與佇列 87 第5章串 123 第6章樹 149 第7章圖 211
資料結構筆記-棧與佇列python實現
概述 棧與佇列是程式設計中被廣泛應用的兩種重要的資料結構,都是在特定範圍的儲存單元記憶體儲資料,這些資料都可以被重新取出使用,與線性表相比,他們的插入和刪除受到更多的約束,固又稱限定性的線性表結構。他們是最簡單的快取結構,他們只支援資料項的儲存與訪問,不支援資料項之間的任何關係。因此,這兩種
【大話資料結構】02 演算法 筆記
《大話資料結構》 ——程傑 共463頁 筆記圈點主要內容,也請多多支援大話資料結構該書作者 第 2 章 演算法 42頁_開場白 44頁_演算法定義 演算法的定義
【大話資料結構】01 資料結構的緒論 筆記
《大話資料結構》 ——程傑 共463頁 筆記圈點主要內容,也請多多支援大話資料結構該書作者。 第 1 章 資料結構的緒論 26頁_開場白 28頁_基本概念和術語 資料結構課程 是一門研究非
Linux學習筆記(演算法與資料結構)之 佇列程式碼(C語言)
1、程式碼在VS2010的C++編譯器中編譯通過,可能有極少部分語法不符合C89標準;bool型別無法使用,用int代替 2、由於VS配置問題,沒有分.c和.h檔案書寫;如果要分,最好將Create_Node和Destory_Node加上static關鍵字修飾,他們只會在所
《大話資料結構》筆記
第1章 資料結構緒論 資料結構:是相互之間存在一種或多種特定關係的資料元素的集合。 邏輯結構是面向問題的,而物理結構就是面向計算機的,其基本的目標就是將資料及其邏輯關係儲存到計算機的記憶體中。 邏輯結構:實質是指資料物件中資料元素之間的相互關係。 1.集合結構
《大話資料結構》讀書筆記(2)
這一篇再來說說我對於串的理解。 字串是我們經常會用到的一種資料型別,它可以表示為一個字元陣列。 1、資料型別 對於字串的操作會有很多,但其中非常核心則是比較、拼接、擷取、索引和替換,都是圍繞子串一些操作。 2、儲存結構 因為字串實質上是一個字元陣列