1. 程式人生 > >資料結構之 佇列(Queue)的實現及簡單操作

資料結構之 佇列(Queue)的實現及簡單操作

在生活中我們經常會遇到排隊的事情,比如說排隊買東西,大家依次站一個隊,隊頭的人要比後面的人先買到東西,先到先得,然後買完東西就會離開這個隊 而我們平時為了解決在比如說打客服電話,排隊叫號之類的應用問題時我們就應用了 佇列 這種資料結構,實現先到先得,先入先出的排隊功能 佇列(Queue):是隻允許在一端進行插入操作,在另一端進行刪除操作的線性表。 佇列也是一種特殊的線性表,是一種先進先出的線性表。允許插入的一端稱為表尾(隊尾),允許刪除的一端稱為表頭(隊頭)。

通常我們對於佇列的基本操作包括 入隊、出隊、檢視對內元素個數、檢視對頭元素、檢視對尾元素、清空佇列 基於佇列只能在隊尾插入,只能在隊頭刪除的特性,使用連結串列來實現佇列相比於順序表更為合適,所以我們用單鏈表來實現佇列 其次我們使用單鏈表來實現佇列就要定義對內元素結點 typedef
 int DataType; typedef struct QueueNode { DataType _data; struct QueueNode* _next; }QueueNode; 其次定義佇列的結構體,包括兩個指標_head和_tail分別指向隊頭和隊尾和一個size來記錄當前佇列裡面元素個數 typedef struct Queue { QueueNode* _head;//隊頭 QueueNode* _tail;//隊尾 size_t _size; }Queue; 接著就是相關操作函式介面的宣告 QueueNode* BuyNewQueueNode(
DataType x);//建立新的結點 void QueueInit(Queue* q);//佇列的初始化 void QueuePush(Queue* q, DataType x);//入隊 void QueuePop(Queue* q);//出隊 DataType QueueFront(Queue* q);//隊頭元素 DataType QueueBack(Queue* q);//隊尾元素 size_t QueueSize(Queue* q);//隊內元素個數 int QueueEmpty(Queue* q);//清空隊 以上這些可以放在QueueNode .h中進行定義、宣告 QueueNode .c
中對相關函式介面進行定義實現
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<assert.h> #include"QueueNode .h" QueueNode* BuyNewQueueNode(DataType x)//建立新的結點 { QueueNode* tmp = (QueueNode*)malloc(sizeof(QueueNode)); if (tmp != NULL)        {               tmp->_data = x;               tmp->_next = NULL; return tmp;        } return NULL; } void QueueInit(Queue* q)//佇列的初始化 { q->_head = NULL; q->_tail = NULL; q->_size = 0; } void QueuePush(Queue* q, DataType x)//入隊 { assert(q); QueueNode* NewNode = BuyNewQueueNode(x); if (q->_size == 0)        { q->_head = NewNode; q->_tail = NewNode; q->_size++;        } else        { q->_tail->_next = NewNode; q->_tail = NewNode; q->_size++;        } } void QueuePop(Queue* q)//出隊 { assert(q); if (q->_size == 0)        {               printf("佇列為空,無可出隊元素!!\n"); return;        } if (q->_size == 1)        {               free(q->_head); q->_head = NULL; q->_tail = NULL; q->_size--; return;        } else        { QueueNode* cur = q->_head->_next;               free(q->_head); q->_head = cur; q->_size--; return;        } } DataType QueueFront(Queue* q)//隊頭元素 { assert(q&&q->_head); return q->_head->_data; } DataType QueueBack(Queue* q)//對尾元素 { assert(q&&q->_tail); return q->_tail->_data; } size_t QueueSize(Queue* q)//隊內元素個數 { assert(q); return q->_size; } int QueueEmpty(Queue* q)//清空佇列 { assert(q); if (q->_size == 0)        { return 0;        } else        { QueueNode* cur = q->_head->_next; while (q->_head != q->_tail)               {                      free(q->_head); q->_head = cur;                      cur = cur->_next;               }               free(q->_head); q->_head = NULL; q->_tail = NULL; q->_size = 0; return 0;        }

相關推薦

資料結構 佇列Queue實現簡單操作

在生活中我們經常會遇到排隊的事情,比如說排隊買東西,大家依次站一個隊,隊頭的人要比後面的人先買到東西,先到先得,然後買完東西就會離開這個隊 而我們平時為了解決在比如說打客服電話,排隊叫號之類的應用問題時我們就應用了 佇列 這種資料結構,實現先到先得,先入先出的排隊功能

基本資料結構佇列queue

template<class T>class queueNode{    public:    queueNode():next(NULL){}    T data;//值    queueNode* next;//指向下一個節點的指標};template<class T>class 

linux核心分析--核心中的資料結構佇列

核心中的佇列是以位元組形式儲存資料的,所以獲取資料的時候,需要知道資料的大小。 如果從佇列中取得資料時指定的大小不對的話,取得資料會不完整或過大。 核心中關於佇列定義的標頭檔案位於:<linux/kfifo.h> include/linux/kfifo.h 標頭檔案中定義的函

C++編寫利用資料結構佇列Queue打印出使用者所指定長度的楊輝三角

#include <iostream> #include <assert.h> using namespace std; class Yanghui{ public:  class Node{  public:   Node():data(0){  

資料結構4--佇列java程式碼實現佇列的鏈式儲存

1.什麼是佇列?      佇列也叫隊,時允許在一段進行擦汗如另一端進行刪除的運算受限的線性表。區別佇列和棧:棧時先進後出,佇列時先進先出。                 &nbs

資料結構Heap實現

  堆資料結構是一種陣列物件,它可以被視為一棵完全二叉樹結構,所以堆也叫做二叉堆。二叉堆滿足二個特性:  1.父結點的鍵值總是大於或等於(小於或等於)任何一個子節點的鍵值。  2.每個結點的左子樹和右子樹都是一個二叉堆(都是最大堆或最小堆)。  當父結點的鍵值總是大於或等於任

資料結構順序儲存結構實現線性表

用陣列(順序儲存結構)來實現線性表 該資料結構具有如下功能: 初始化 獲取資料 在表尾新增資料 彈出表尾資料 設定指定位置資料 刪除指定位置資料 在指定位置插入資料 優點 1、無須為表示表中元素之間的邏輯關係而增加額外的儲存空間 2、可以快速地存取表中任一位置的元素

資料結構陣列C語言實現

陣列是大家很熟悉的一種資料型別,而且在我們的程式設計中也應用非常廣泛。這裡以抽象資料型別的形式討論陣列的定義和實現。 一、陣列的定義 假設n維陣列中含有第i維的長度為b(i),則陣列的總長度為b(0) *b(1)*...*b(n-1),每個元素都受著n個

資料結構鄰接表實現C++

一、圖的鄰接表實現 1.實現了以頂點順序表、邊連結串列為儲存結構的鄰接表; 2.實現了圖的建立(有向/無向/圖/網)、邊的增刪操作、深度優先遞迴/非遞迴遍歷、廣度優先遍歷的演算法; 3.採用頂點物件列表、邊(弧)物件列表的方式,對圖的建立進行初始化;引用 "ObjArr

Python3&資料結構合併歸併排序

合併(歸併)排序和快速排序一樣也採用了分而治之(divide and conquer,D&C)的思想 不過對比快速排序,mergesort沒有pivot(中心點) 分的部分: 它是把一個無序陣列按照陣列大小的中心數分為兩部分 if len(n) < 2

資料結構查詢:雜湊表

雜湊(雜湊)技術既是一種儲存方法,也是一種查詢方法。然而它與線性表、樹、圖等結構不同的是,前面幾種結構,資料元素之間都存在某種邏輯關係,可以用連線圖示表示出來,而雜湊技術的記錄之間不存在什麼邏輯關係,它只與關鍵字有關聯。因此,雜湊主要是面向查詢的儲存結構。雜湊技術

資料結構排序——歸併排序

歸併排序(Merging Sort):假設初始序列含有n個記錄,則可以看成是n個有序的子序列,每個子序列的長度為1,然後倆倆歸併,得到[n/2]([x]表示不小於x的最小整數)個長度為2或1的有序子序列;再倆倆歸併,....,如此重複,直至得到一個長度為n的有序序列為止,這

java資料結構陣列Array

最近一直在學習資料結構,於是乎就想寫一篇部落格記錄下自己所學,順便把知識鞏固下,畢竟資料結構嘛,是一切程式設計的基礎,‘’雄關漫道真如鐵,而今邁步從頭越‘’。。。。。。一切的一切都要從頭開始,只有基礎好了,寫起程式來才能6666。 注:以下內容 ,有參考別人的部

走進資料結構排序---直接插入排序

一、直接插入排序演算法分析 直接插入排序是假定前i個構成的子序列是處於已排序的情況下進行排序的,然後將第i個元素與前i個構成的子序列逆序進行比較,如果是要升序排序,則比較第i個元素是否比j=i-1(i-1需要>=0)的元素大,如果是則第i個元素的位置(即j+1的位置上

資料結構——二叉樹定義和性質

二叉樹(Binary Tree)是n(n>=0)個結點的有限集合,該集合或者為空集(稱為空二叉樹),或者由一個根結點和倆棵互不相交的,分別稱為根結點的左子樹和右子樹的二叉樹組成。 如圖: 二叉樹的特點 二叉樹的特點: 1.每個結點最多有倆棵子樹,所以二叉樹中不存在度

資料結構堆疊c

相關知識 1.函式封裝 2.堆疊(先進後出,後進先出) 3.指標(記憶體申請,結構體運用) 標頭檔案及其宣告 #ifndef STACKLIST_H_INCLUDED #define STAC

用兩個佇列Queue實現一個棧Stack

class Stack2 { private Queue<int> q1; private Queue<int> q2;

Java資料結構和演算法樹的基本操作

Java資料結構和演算法(二)樹的基本操作 一、樹的遍歷 二叉樹遍歷分為:前序遍歷、中序遍歷、後序遍歷。即父結點的訪問順序 1.1 前序遍歷 基本思想:先訪問根結點,再先序遍歷左子樹,最後再先序遍歷右子樹即根—左—右。圖中前序遍歷結果是:1,2,4,5,7,8,3,6。 // 遞迴實現前序遍歷

資料結構JavaScript實現佇列queue

    和棧一樣,佇列其實也是一種列表,不同的是佇列只能在隊尾插入元素,在隊首刪除元素,也就是說,佇列是先進先出的資料結構;而棧是先進後出的資料結構。佇列的主要操作就是入隊和出隊操作,也就是隊尾插入元素和隊首刪除元素。佇列還有一個比較重要的操作就是讀取隊首

資料結構佇列的順序表示及其實現迴圈佇列

記錄一下自己學習過程中寫的程式碼。以下是我看嚴蔚敏老師的資料結構教材後,結合教材所講用C語言實現了關於佇列的順序表示及其實現的基本操作,供以後複習所用。和順序棧類似,在佇列的順序儲存結構中,除了用一組地址連續的儲存單元一次存放從隊頭到隊尾的元素之外,尚需附設隊頭指標Fron