C語言/數據結構——每日一題(設計循環隊列)

一.前言

上一次我們分享了關于隊列的基本實現——https://blog.csdn.net/yiqingaa/article/details/139033067?spm=1001.2014.3001.5502

現在我們將使用隊列知識來解決問題——設計循環隊列:https://leetcode.cn/problems/design-circular-queue/submissions/533299335

二.正文

1.1題目描述

?

1.2題目分析

?

本題給了我們七個操作需求,需要我們將這些函數功能實現出來。

對于這道題,假如我們是使用數組來實現隊列,在這里我們可以事先模擬走一下:

?

那么我們如何解決這個問題呢。在這里我們我們可以通過多創建一個空間的方式解決這個問題。

?

(1)定義棧的結構

typedef struct {int* a;//a是int*類型的數組int k;//k代表了我們的數組長度int head;//head會指向我們的頭元素(head在這里不是指針,可以當成另類的下標)int tail;//tail在我們數據的后一個位置(tail在這里不是指針,可以當成另類的下標)
} MyCircularQueue;

假如k是4,數組有1,2,3,4這些數據。那么就有:

?

?(2)創建我們的隊列

MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj->a=(int*)malloc(sizeof(int)*(k+1));if(obj->a==NULL){perror("malloc fail!");}obj->k=k;obj->head=obj->tail=0;return obj;
}

我們首先為我們的隊列結構體申請了sizeof(MyCircularQueue)字節大小的空間。

然后又為了我們數組申請了sizeof(int)*(k+1)字節大小的空間。

用我們的結構體成員k接受形參k的值。

并讓head,tail都初始化為0。

(3)判斷隊列是否為空

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {if(obj->head==obj->tail)return true;return false;
}

這里我們先實現了判斷隊列是否為空的函數功能,因為這個函數功能在后面實現數據插入和刪除中都需要用到,因此,在這里我們就先實現了。

?(4)判斷隊列是否數據已滿

bool myCircularQueueIsFull(MyCircularQueue* obj) {if((obj->tail+1)%(obj->k+1)==obj->head)return true;return false;
}

?(5)隊列數據的插入

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(myCircularQueueIsFull(obj)==true)return false;
obj->a[obj->tail]=value;
obj->tail++;
obj->tail=(obj->tail)%(obj->k+1);
return true;
}

這里我們先進行了判斷,如果隊列數據已經滿了,就插不了數據了,直接返回false即可。

在這里,我們需要額外注意這行代碼:obj->tail=(obj->tail)%(obj->k+1);

相信同學們看到這里已經發現了,我們上述代碼中很多都用到了取余%的應用,這是為了讓head和tail能正常的循環。

(6) 隊列數據的刪除

bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj)==true)return false;obj->head++;obj->head=(obj->head)%(obj->k+1);return true;
}

這里我們需要知道,如果隊列沒有數據的時候,我們不能進行數據刪除,因為本來隊列都沒數據了,再刪除就會出現內存泄露的問題。

(7) 取出隊頭的數據

int myCircularQueueFront(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj)==true)return -1;return obj->a[obj->head];
}

?(8)取出隊尾的數據

int myCircularQueueRear(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj)==true)return -1;return obj->a[(obj->tail-1+obj->k+1)%(obj->k+1)];
}

?(9)銷毀我們創建的對列

void myCircularQueueFree(MyCircularQueue* obj) {free(obj->a);free(obj);
}

?1.3代碼實現

typedef struct {int* a;int k;int head;int tail;
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj->a=(int*)malloc(sizeof(int)*(k+1));if(obj->a==NULL){perror("malloc fail!");}obj->k=k;obj->head=obj->tail=0;return obj;
}bool myCircularQueueIsEmpty(MyCircularQueue* obj) {if(obj->head==obj->tail)return true;return false;
}
bool myCircularQueueIsFull(MyCircularQueue* obj) {if((obj->tail+1)%(obj->k+1)==obj->head)return true;return false;
}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(myCircularQueueIsFull(obj)==true)return false;
obj->a[obj->tail]=value;
obj->tail++;
obj->tail=(obj->tail)%(obj->k+1);
return true;
}bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj)==true)return false;obj->head++;obj->head=(obj->head)%(obj->k+1);return true;
}int myCircularQueueFront(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj)==true)return -1;return obj->a[obj->head];
}int myCircularQueueRear(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj)==true)return -1;return obj->a[(obj->tail-1+obj->k+1)%(obj->k+1)];
}void myCircularQueueFree(MyCircularQueue* obj) {free(obj->a);free(obj);
}/*** Your MyCircularQueue struct will be instantiated and called as such:* MyCircularQueue* obj = myCircularQueueCreate(k);* bool param_1 = myCircularQueueEnQueue(obj, value);* bool param_2 = myCircularQueueDeQueue(obj);* int param_3 = myCircularQueueFront(obj);* int param_4 = myCircularQueueRear(obj);* bool param_5 = myCircularQueueIsEmpty(obj);* bool param_6 = myCircularQueueIsFull(obj);* myCircularQueueFree(obj);
*/

以上代碼就是我們在力扣網上運行的代碼。

三.結言

本題的分享就到這了,有興趣的小伙伴,能不能給個三連,真的求求了。

帥哥美女們,咱們下期再見。

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

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

相關文章

50.WEB滲透測試-信息收集-CDN識別繞過(3)

免責聲明:內容僅供學習參考,請合法利用知識,禁止進行違法犯罪活動! 內容參考于: 易錦網校會員專享課 上一個內容:49.WEB滲透測試-信息收集-CDN識別繞過(2) 關于cdn的識別方法內容…

Leecode熱題100--73:矩陣置零

題目: 給定一個 m x n 的矩陣,如果一個元素為 0 ,則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 C: 思路: 可以使用兩個數組來記錄哪些行和列需要被置零。 首先,我們遍歷整個矩陣,…

設計模式--享元模式

引言 享元模式(Flyweight Pattern)作為一種高效節省內存的結構型設計模式,其核心在于通過共享技術有效支持大量細粒度對象的重用,從而減少內存占用,提高系統性能。特別是在處理大量相似對象的場景下,享元模…

智慧監獄人員行為識別監測系統

智慧監獄人員行為識別監測系統是基于神經網絡AI視覺智能分析算法開發的技術。智慧監獄人員行為識別監測系統利用現場監控攝像頭,通過對人體活動骨架的結構化分析,根據人體運動軌跡定義了多種異常行為,從而實現對監舍內的靜坐不動、離床、攀高…

Tron節點監控腳本使用說明

文章目錄 一、配置二、腳本編寫2.1 Python腳本--監控節點是否正在同步2.1.1 pyton腳本腳本示例2.1.2 使用說明2.2.3 腳本監控內容說明 2.2 Shell腳本--綜合情況監控2.2.1 shell腳本示例2.2.2 使用說明2.2.3 腳本監控內容說明 最近搭建了TRON節點,為了防止節點在生產…

Mixiy(米思齊)安裝

Mixiy(米思齊)安裝 官網地址:愛上米思齊 打開官網,選擇下圖的軟件進行下載 復制提取碼,點擊鏈接跳轉到網盤進行下載,選擇(RC4完整版) 下載完成后,解壓到合適的位置,進入文件夾,雙擊Mixly.exe即…

Docker 部署Jenkins

1、運行鏡像 docker run --namejenkins \--restartalways \--privilegedtrue \-u root \-p 8080:8080 \-p 50000:50000 \-v /home/docker/jenkins/jenkins_home:/var/jenkins_home \-v /usr/bin/docker:/usr/bin/docker \-v /var/run/docker.sock:/var/run/docker.sock \-e TZ…

【Crypto】MD5

文章目錄 MD5解題感悟 MD5 提示的很明顯MD5 小小flag,拿下! 解題感悟 沒啥感悟…

Java輸入與輸出詳解

Java輸入和輸出 前言一、Java打印Hello World二、輸出到控制臺基本語法代碼示例格式化字符串 三、從鍵盤輸入讀入一個字符正確寫法 使用 Scanner 讀取字符串/整數/浮點數使用 Scanner 循環讀取 N 個數字 前言 推薦一個網站給想要了解或者學習人工智能知識的讀者,這…

使用 Java 和 MyBatis 實現動態排序的多表查詢

相關 java實現一個根據字段和排序方式進行排序 java實現自定義排序 自定義動態排序 前言 在Web開發中,前端通常會傳遞一些參數來決定數據的排序方式,例如排序字段和排序方向。本文將展示如何在 Java 項目中結合 MyBatis 實現動態排序,尤其…

MySQL-性能分析

1、數據庫服務器的優化步驟 2、查看系統性能參數 可以使用show status語句查詢一些MySQL數據庫服務器的性能參數 執行頻率語法格式:show [ global | session ] status like 參數 ;常用性能參數如下所示 參數名說明connection連接MySQL服務器的次數upti…

Autodesk 3ds Max下載,3ds MAX 2024三維建模渲染軟件安裝包下載安裝

3ds MAX中文版,其強大的功能和靈活的操作為廣大用戶提供了無限的創意空間,使得高質量動畫、最新游戲、設計效果等領域的制作需求得以完美滿足。 ? 作為一款三維建模軟件,3ds MAX中文版具備極高的建模精度和渲染質量。它支持多種建模方式&am…

【Fiddler抓包工具】第四節.斷點設置和弱網測試

文章目錄 前言一、斷點設置 1.1 全局斷點 1.2 局部斷點 1.3 打斷點的幾種常用命令 1.4 篡改響應報文二、弱網測試 2.1 網絡限速 2.2 精準限速總結 前言 一、斷點設置 1.1 全局斷點 特點: 中斷Fiddler捕獲的所有請求,包括…

記錄一次prometheus因時區不同導致的無法獲取數據問題

一、故障出現原因 prometheus機器壓力過大,內存耗盡,負載飆高,導致無法登錄; 于是從公有云web界面進行重啟,重啟后內存還是不足,負載很快升高; 對機器進行配置變更,由4C8G升級為4…

在鏈游中,智能合約如何被用于實現游戲內的各種功能

隨著區塊鏈技術的快速發展,鏈游(Blockchain Games)作為區塊鏈技術的重要應用領域之一,正逐漸展現出其獨特的魅力和優勢。其中,智能合約作為鏈游的核心技術之一,對于實現游戲內的各種功能起到了至關重要的作…

【C++初階】—— 類和對象 (下)

📝個人主頁🌹:EterNity_TiMe_ ?收錄專欄?:C “ 登神長階 ” 🌹🌹期待您的關注 🌹🌹 類和對象 1. 運算符重載運算符重載賦值運算符重載前置和后置重載 2. 成員函數的補充3. 初始化列…

Java的函數式接口和 Lambda 表達式

在 Java 8 中,可以通過使用函數式接口和 Lambda 表達式來實現類似 JavaScript 中將函數作為參數傳遞的功能。 以下是一個簡單的示例,演示如何在 Java 中使用函數式接口將函數作為參數傳遞: 定義一個函數式接口(函數式接口是只有…

CentOS上升級glibc2.17至glibc2.31

glibc是Linux系統中的重要組件之一。在CentOS中,glibc通常是作為系統的默認C標準庫使用的,因為它是許多軟件的基礎庫。在CentOS中,glibc的版本通常與CentOS版本一起發布。因為CentOS通常會優先選擇穩定性而不是最新性,所以CentOS使…

Vue項目如何進行XSS防護

前言 在目前主推網絡安全的情況下,很多開發項目都需要在上線前進行滲透測試,當符合滲透測試標準及沒有安全漏洞即可正常上線,當前還會有代碼審計的,這個另當別論。 如何對XSS進行防護 在很多的富文本編輯器項目中,x…

leecode熱題100---994:腐爛的橘子

題目: 在給定的 m x n 網格 grid 中,每個單元格可以有以下三個值之一: 值 0 代表空單元格; 值 1 代表新鮮橘子; 值 2 代表腐爛的橘子。 每分鐘,腐爛的橘子 周圍 4 個方向上相鄰 的新鮮橘子都會腐爛。 返回…