【腳踢數據結構】隊列(順序和鏈式)

  • (??? ),Hello我是祐言QAQ
  • 我的博客主頁:C/C++語言,Linux基礎,ARM開發板,軟件配置等領域博主🌍
  • 快上🚘,一起學習,讓我們成為一個強大的攻城獅!
  • 送給自己和讀者的一句雞湯🤔:集中起來的意志可以擊穿頑石!
  • 作者水平很有限,如果發現錯誤,可在評論區指正,感謝🙏


????????在我們的日常生活中,隊列是一個非常常見的現象。無論是在商店結賬,還是在公交站等車,我們都在使用隊列。在計算機科學中,隊列也是一個重要的數據結構,用于處理和組織數據。在這篇文章中,我們將詳細探討隊列的定義、操作、以及如何用C語言實現隊列。

一、隊列的定義


????????隊列(Queue)是一種特殊類型的線性數據結構,它遵循特定的操作規則,即遵循“先進先出”(FIFO,First-In-First-Out)原則。這意味著在隊列中,首先加入的元素將會首先被移除,最后加入的元素將會最后被移除。

? ? ? ? ?當我們想存入1時,先移動front(隊頭)然后再寫入數據1,拿數據也是一樣,但務必保證先移動rear(隊尾),再拿出數據,否則將會錯位導致出錯。

二、順序隊列

? ? ? 1.? 隊列結構體定義


????????首先需要定義一個順序隊列,我們可以使用結構體來定義一個隊列,它包含一個數組(用于存儲隊列的數據)和三個整數(用于表示隊列長度、隊首和隊尾的位置)。


typedef int Datatype;//隊列的結構體定義
typedef struct Quene
{Datatype *q;	//用來存放隊列的數據int size;		//隊列的長度int front;		//隊頭int rear;		//隊尾
}queue;

????2.? 初始化隊列


????????接下來,我們需要初始化隊列。在初始化時,我們將隊首和隊尾都設置為0,表示隊列為空。

//初始化一個隊列
queue *init_queue(int size)
{queue *que = malloc(sizeof(queue));if (que!=NULL){que->q = calloc(size, sizeof(Datatype));que->size = size;que->front = 0;que->rear = 0;}return que;
}

????3.? 隊空和隊滿


? ? ? ? 如果我們想要實現入隊和出隊操作,我們需要先考慮隊列可能會溢出或下溢的情況,因此我們需要判斷是否隊空或隊滿。

//隊空判斷
bool isempty_queue(queue *q)
{return (q->rear == q->front);
}//隊滿判斷
bool isfull_queue(queue *q)
{return ((q->rear+1)%q->size == q->front);
}

????4.? 入隊和出隊

//入隊
bool en_queue(queue *que, Datatype data)
{if (isfull_queue(que)){return false;}//先挪rearque->rear = (que->rear+1)%(que->size);//再入數據que->q[que->rear] = data;return true;
}//出隊
bool de_queue(queue *que, Datatype *data)
{if (isempty_queue(que)){return false;}//先挪frontque->front = (que->front+1)%(que->size);//再取數據*data = que->q[que->front];return true;
}


????????隊列是計算機科學中的一個基礎概念,它在許多場景中都有應用,如操作系統的任務調度,網絡的數據包處理等。理解隊列的工作原理并能夠實現隊列,對于學習和理解計算機科學的其他概念是非常有幫助的。希望這篇文章能幫助你理解和實現隊列。

? ? ? ? 下面是一個簡單的順序隊列舉例,實現:輸入正整數,添加員工信息,入隊,用這個正整數表示員工號;輸入負整數,出隊(隊首),顯示該員工的所有信息;否則就退出。

????????員工信息:工號、姓名、工資

? ? ? ? 完整源碼:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>#define SIZE 1024
typedef struct people
{int number;		//工號char name[20];	//姓名int money;		//工資
}Datatype;//隊列的結構體定義
typedef struct Quene
{Datatype *q;	//用來存放隊列的數據int size;		//隊列的長度int front;		//隊頭int rear;		//隊尾
}queue;//初始化一個隊列
queue *init_queue(int size)
{queue *que = malloc(sizeof(queue));if (que!=NULL){que->q = calloc(size, sizeof(Datatype));que->size = size;que->front = 0;que->rear = 0;}return que;
}//隊空判斷
bool isempty_queue(queue *q)
{return (q->rear == q->front);
}//隊滿判斷
bool isfull_queue(queue *q)
{return ((q->rear+1)%q->size == q->front);
}//入隊
bool en_queue(queue *que, Datatype data)
{if (isfull_queue(que)){return false;}//先挪rearque->rear = (que->rear+1)%(que->size);//再入數據que->q[que->rear] = data;return true;
}//出隊
bool de_queue(queue *que, Datatype *data)
{if (isempty_queue(que)){return false;}//先挪frontque->front = (que->front+1)%(que->size);//再取數據*data = que->q[que->front];return true;
}// 添加信息
void init_info(Datatype *data,int n)
{data->number = n;printf("請輸入工人信息\n");while(getchar() != '\n');printf("姓名:");scanf("%s", data->name);printf("工資:");scanf("%d", &data->money);
}int main(int argc, char const *argv[]) {queue *q = init_queue(SIZE);int n;Datatype data;while (1) {printf("請輸入一個正整數或負數\n");scanf("%d", &n);if (n > 0){init_info(&data, n);en_queue(q, data);continue;}else if(n < 0){Datatype d;if (de_queue(q, &d)) {printf("工號:%d,姓名:%s,工資:%d\n", d.number, d.name, d.money);} else {printf("隊列已空,無法出隊。\n");}}else{return -1;}}free(q->q);free(q);return 0;
}

三、鏈式隊列

????????鏈式隊列(Linked Queue)是一種使用鏈表來實現的隊列數據結構。與順序隊列不同,鏈式隊列的元素并不直接存儲在數組中,而是通過鏈表節點來連接。

????????并且 由于使用鏈表實現,鏈式隊列的大小可以根據需要動態分配和釋放內存,避免了固定數組大小可能帶來的限制。因此就沒有是否隊滿問題

1.結構體定義

typedef int Datatype;typedef struct Node
{Datatype data;struct Node *next;
}node;typedef struct List_queue
{node *rear;		//隊尾指針node *front;	//隊頭指針int size;		//鏈式隊列的長度(實際的元素的個數)
}L_q;

2.創建新節點和判斷隊空

//創建新節點
node *create_node(Datatype data)
{node *new = malloc(sizeof(node));if (new != NULL){new->data = data;new->next = NULL;}return new;
}
//鏈式隊列是否為空
bool isempty_list_queue(L_q *q)
{return (q->size == 0);
}

3.初始化隊列

//初始化鏈式隊列
L_q *init_list_queue()
{L_q *q = malloc(sizeof(L_q));if (q!=NULL){q->rear = NULL;q->front = NULL;q->size = 0;}return q;
}

3.入隊

????????入隊操作在鏈表的末尾添加一個新節點,同時更新隊尾指針。

//入隊
bool en_list_queue(L_q *q, Datatype data)
{//先要將數據創建新節點node *new = create_node(data);if (new==NULL){return false;}//如果是第一次入隊,new節點既是隊尾,也是隊頭if (isempty_list_queue(q)){q->rear = new;q->front = new;}else    //不是第一次入隊{//先將尾部節點的next指向new節點q->rear->next = new;//尾部節點要變成新節點newq->rear = new;}//隊的元素個數要+1q->size++;return true;
}

4.出隊

?????????出隊操作移除鏈表的第一個節點,同時更新隊頭指針。

//出隊
bool de_list_queue(L_q *q, Datatype *data)
{if (isempty_list_queue(q)){return false;}else if(q->size == 1)//只有一個數據的時候{q->rear = NULL;}//在鏈表不為空的情況下,先拿隊頭的數據*data = q->front->data;//將隊頭指向下一個節點q->front = q->front->next;//鏈式隊列的元素個數-1q->size--;return true;
}

?5.遍歷

//遍歷
void display(L_q *q)
{if (q->front == NULL){return ;}node *p = q->front;while(p->next != NULL){printf("%d ", p->data);p = p->next;}printf("%d\n", p->data);
}

????????簡單示例:當我們輸入正數時,入隊并遍歷整個隊列;當我們輸入負數時,出隊一個元素,并再次遍歷隊列;輸入0時退出。

int main(int argc, char const *argv[])
{L_q *q = init_list_queue();int num;Datatype data;while(1){scanf("%d", &num);if(num > 0){en_list_queue(q, num);	display(q);	}else if(num < 0){de_list_queue(q, &data);display(q);	}else{break;}}return 0;
}

四、結語

????????
????????隊列作為一種基本的數據結構,在我們的編程生涯中扮演著重要的角色。希望這篇文章提供了一個清晰、詳細的隊列概述,幫助你理解隊列的基本概念和操作,以及如何用C語言實現隊列。

????????選擇順序隊列還是鏈式隊列取決于實際應用的需求。如果你需要一個固定大小的隊列,可以考慮使用順序隊列。如果你希望隊列大小能夠根據需要進行動態調整,那么鏈式隊列更適合。在大多數情況下,鏈式隊列具有更好的擴展性和靈活性。

????????更多C語言Linux系統ARM板實戰數據結構相關文章,關注專欄:

? ?手撕C語言

? ? ? ? ? ? 玩轉linux

????????????????????腳踢數據結構

?? ? ? ? ? ? ? ? ?? ? ? ? ? 6818(ARM)開發板實戰

📢寫在最后

  • 今天的分享就到這啦~
  • 覺得博主寫的還不錯的煩勞?一鍵三連喔~
  • 🎉感謝關注🎉

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40866.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40866.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40866.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ant Design Vue 下拉框輸入框 可以輸入 可以查詢

Ant Design Vue 下拉框 可以輸入 可以查詢 直接上代碼 效果圖 &#xff08;輸入內容查詢后端 返回下拉的值 &#xff0c;如何查詢后端是空的直接 把輸入的內容 賦值給 輸入框&#xff09; 在這里插入圖片描述 <template><div><a-selectv-model.lazy"i…

WPF CommunityToolkit.Mvvm

文章目錄 前言ToolkitNuget安裝簡單使用SetProperty&#xff0c;通知更新RealyCommandCanExecute 新功能&#xff0c;代碼生成器ObservablePropertyNotifyCanExecuteChangedForRelayCommand其他功能對應關系 NotifyPropertyChangedFor 前言 CommunityToolkit.Mvvm&#xff08;…

自適應AI chatgpt智能聊天創作官網html源碼

我們致力于開發先進的自適應AI智能聊天技術&#xff0c;旨在為用戶提供前所未有的聊天體驗。通過融合自然語言處理、機器學習和深度學習等領域的頂尖技術&#xff0c;我們的智能聊天系統能夠準確理解用戶的需求并給出相應的回應。 我們的自適應AI智能聊天系統具備以下核心特點…

MySQL面試題二

1、關系型和非關系型數據庫的區別&#xff1f; 關系型數據庫的優點 容易理解&#xff0c;因為它采用了關系模型來組織數據。 可以保持數據的一致性。 數據更新的開銷比較小。 支持復雜查詢&#xff08;帶 where 子句的查詢&#xff09; 非關系型數據庫&#xff08;NOSQL&#x…

fiddler抓包問題記錄,支持https、解決 tunnel to 443

fiddler下載安裝步驟及基本配置 fiddler抓包教程&#xff0c;如何抓取HTTPS請求&#xff0c;詳細教程 可能遇到的問題及解決方案 1. 不能正常訪問頁面&#xff08;所有https都無法訪問&#xff09; 解決方案&#xff1a;查看下面配置是否正確 Rules-customization 找到 OnB…

Vue中路由緩存問題及解決方法

一.問題 Vue Router 允許你在你的應用中創建多個視圖&#xff0c;并根據路由來動態切換這些視圖。默認情況下&#xff0c;當你從一個路由切換到另一個路由時&#xff0c;Vue Router 會銷毀前一個路由的組件實例并創建新的組件實例。然而&#xff0c;有時候你可能希望保持一些頁…

【推薦】深入淺出學習Spring框架【中】

目錄 1.AOP是什么? 2.案列&#xff1a; 3.spring的aop的專業術語 4.代碼模擬 4.1 前置通知 3.2.后置通知 3.3.環繞通知 3.4.異常通知 3.5.過濾通知 1.AOP是什么? 面向切面編程&#xff08;Aspect-Oriented Programming&#xff09;是一種編程范式&#xff0c;它的主要…

第十四屆中國大學生服務外包大賽細品,上百支隊伍與合合信息用AI共克“記賬”難題

前言 熟悉我的小伙伴應該知道我在大學時期參與了很多競賽&#xff0c;我向來對比賽是比較熱枕的&#xff0c;以我個人觀點&#xff0c;我認為可以通過競賽激發學習激情和檢驗自己的技能水平掌握情況&#xff0c;大學生很少有機會能夠了解到課堂之外市場的需求&#xff0c;外包…

P1123 取數游戲

取數游戲 題目描述 一個 N M N\times M NM 的由非負整數構成的數字矩陣&#xff0c;你需要在其中取出若干個數字&#xff0c;使得取出的任意兩個數字不相鄰&#xff08;若一個數字在另外一個數字相鄰 8 8 8 個格子中的一個即認為這兩個數字相鄰&#xff09;&#xff0c;求…

JWT(JSON Web Token )令牌

1、介紹 jwt就是將原始的json數據格式進行了安全的封裝&#xff0c;這樣就可以直接基于jwt在通信雙方安全的進行信息傳輸了。 2、jwt組成 第一部分&#xff1a;Header(頭&#xff09;&#xff0c; 記錄令牌類型、簽名算法等。 例如&#xff1a;{"alg":"HS256…

EXCEL按列查找,最終返回該列所需查詢序列所對應的值,VLOOKUP函數

EXCEL按列查找&#xff0c;最終返回該列所需查詢序列所對應的值 示例&#xff1a;國標行業分類漢字&#xff0c;匹配id 使用VLOOKUP函數 第一參數&#xff1a;拿去查詢的值。 第二參數&#xff1a;匹配的數據。 Ps&#xff1a;Sheet1!$C 21 : 21: 21:E 117 &#xff0c;需要…

Redis系列(三):深入解讀Redis主從同步機制

首發博客地址 https://blog.zysicyj.top/ Redis高可靠靠什么保證&#xff1f; 為什么要提這個呢&#xff0c;因為Redis主從庫目的呢其實就是為了實現高可靠。上篇文章中我們說過Redis的AOF、RDB日志其實就是為了減少數據丟失&#xff0c;這是高可靠的一部分。 這篇文章呢&#…

Lua 位和字節

一、位運算 從 Lua 5.3 版本開始&#xff0c;提供了針對數值類型的一組標準位運算符&#xff0c;與算數運算符不同的是&#xff0c;運算符只能用于整型數。 運算符描述&按位與|按位或&#xff5e;按位異或>>邏輯右移<<邏輯左移&#xff5e;&#xff08;一元運…

Git 如何使用TortoiseGit 操作本地倉庫

初始化倉庫 方法一: 新建一個文件夾,進入文件夾內部操作 1、右鍵--> 在這里創建Git 版本庫 注意: 不要直接在桌面上操作,否則桌面就是一個倉庫 方法二: 1、右鍵-->Git GUI here 方法三: 命令行模式 1、 git init 創建完畢倉庫,我們發現,此時我們創建的文件夾下…

leetcode做題筆記83刪除排序鏈表中的重復元素

給定一個已排序的鏈表的頭 head &#xff0c; 刪除所有重復的元素&#xff0c;使每個元素只出現一次 。返回 已排序的鏈表 。 輸入&#xff1a;head [1,1,2] 輸出&#xff1a;[1,2] 思路一&#xff1a;模擬題意 struct ListNode* deleteDuplicates(struct ListNode* head){i…

FreeRTOS qemu mps2-an385 bsp 移植制作 :系統運行篇

相關文章 FreeRTOS qemu mps2-an385 bsp 移植制作 &#xff1a;環境搭建篇 FreeRTOS qemu mps2-an385 bsp 移植制作 &#xff1a;系統啟動篇 開發環境 Win10 64位 VS Code&#xff0c;ssh 遠程連接 ubuntu VMware Workstation Pro 16 Ubuntu 20.04 FreeRTOSv202212.01&a…

React 全棧體系(二)

第二章 React面向組件編程 一、基本理解和使用 1. 使用React開發者工具調試 2. 效果 2.1 函數式組件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>1_函數式組件</title> </head> &l…

計算機競賽 python 爬蟲與協同過濾的新聞推薦系統

1 前言 &#x1f525; 優質競賽項目系列&#xff0c;今天要分享的是 &#x1f6a9; python 爬蟲與協同過濾的新聞推薦系統 &#x1f947;學長這里給一個題目綜合評分(每項滿分5分) 難度系數&#xff1a;3分工作量&#xff1a;3分創新點&#xff1a;4分 該項目較為新穎&…

軟件壓力測試對軟件產品起到什么作用?

一、軟件壓力測試是什么? 軟件壓力測試是一種通過模擬正常使用環境中可能出現的大量用戶和大數據量的情況&#xff0c;來評估軟件系統在壓力下的穩定性和性能表現的測試方法。在軟件開發過程中&#xff0c;經常會遇到一些性能瓶頸和穩定性問題&#xff0c;而軟件壓力測試的作…

react-codemirror2 編輯器需點擊一下或者延時才顯示數據的問題

現象&#xff1a; <Codemirror/>組件的數據已經賦上值的情況下&#xff0c;初始狀態不渲染數據&#xff0c;需要點擊編輯框獲取焦點后才展示&#xff0c;或者延遲了幾秒才顯示出來。 原因&#xff1a; 指定了一些依賴的版本&#xff0c;可能不兼容了一些功能&#xff0c…