力扣OJ題講解——循環隊列

今天我們一起來做一道關于隊列的OJ題目,這是力扣題目622題,點擊題目鏈接可以直接跳轉,https://leetcode.cn/problems/design-circular-queue/

首先,我們看到要求,需要我們實現哪些功能??

?我們需要設置隊列長度K,隊首元素,隊尾元素,插入元素,刪除元素,判斷空,判斷滿。那這么多接口,我們要從哪里入手呢?我們現在做題無外乎要么用順序表的方式,要么用鏈表的方式,使用兩者其實都可以,今天我們就用順序表的方式實現吧。既然使用順序表也就是數組,那么我們要考慮一點,在什么情況下這個隊列為空?要確定這個循環隊列為空,那就需要保證,頭元素的下標和尾元素的下標相等才可以,假設我們設頭元素下標為front,back為尾元素下一個位置,因為我們要區分back=0時,到底是有一個元素還是沒有元素的情況。即要保證front=back時,隊列為空。

考慮了隊列為空的情況,那什么時候循環隊列滿了呢?滿了就是已經不能再放其它元素,也就是尾位置,back就要追上front了,也就是back=front嗎?那我們想一想,隊列為空的時候和隊列為滿的時候,都是front=back,我們要怎么區分這兩種情況呢?

我們不妨設置隊列長度K的時候多開一個空間,即k+1,我們保證k+1個空間最多只使用k個,留出一個位置,讓back+1=front時為滿隊列。這樣就能區分隊列滿和隊列空的情況了。

下來我們開始做題。

typedef struct {int *a;//數組int front;//隊首元素下標int back;//隊尾元素下標的下一個位置int k;//隊列大小
} MyCircularQueue;

我們定義完結構體變量下來需要對結構題的成員初始化,即

MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj->a=(int*)malloc(sizeof(int)*(k+1));obj->front=0;obj->back=0;obj->k=k;return obj;}

為什么我們要給開k+1個空間呢?原因我們在上面講過了,就是為了讓隊列滿的情況時back+1=front。

下來我們先把容易實現的接口先完成,先把什么時候為空,什么時候為滿實現。

為空

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->front==obj->back;
}

為滿

bool myCircularQueueIsFull(MyCircularQueue* obj) {return obj->back+1=obj->front;//這樣做合適嗎?
}

?我們要考慮到,這是一個循環隊列,下面這種情況能滿足嗎?

back要一直往后走嗎??顯然不是,這是一個循環隊列,當back走到k時,下一次就要回到起點,那怎么表示呢?我們不妨這樣表示,(obj->back+1)%(obj->k+1)==obj->front,這個隊列一共有k+1個空間,我們知道,如果一個小的數%一個比自己大的數是不會改變值的,所以,如果back+1=k+1,此時,back就要回到起點了。所以判斷隊列滿我們可以這樣寫

bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj->back+1)%(obj->k+1)==obj->front;
}

?下面我們寫插入接口

這是一個bool類型,也就是要返回true和false,那什么時候要返回false呢?注意這是往隊列插入元素,如果隊列已經滿了,我們就插不了元素了。剩下就可以正常插入了,直接讓obj->a[obj->back]=value即可,再讓obj->back++。注意到這里,我們還要需要檢查back有沒有超過隊列空間的大小,即我們需要在后面讓obj->back%=obj->k+1;即

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

隊列刪除

刪除接口同樣是bool類型,我們要判斷什么時候刪除失敗?當然就是隊列為空的時候刪除失敗,我們要先檢查隊列是否為空,再刪除,刪除非常簡單,直接讓front++就可以了,front一直在++,有沒有可能front也會超出隊列的空間大小?當然有可能,所以我們也需要對front檢查一下,即obj->front%=obj->k+1;

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

下面就是返回對頭元素

題目里說了,如果隊列為空就返回-1,這種情況我們也要處理一下,其余就直接返回obj->a[obj->front]即可。

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

?隊尾元素

同樣我們也要處理一次隊列為空返回-1的情況,然后直接返回obj->a[obj->back-1]可以嗎?

我們思考一下,如果back=0呢?我說的不是隊列為空時,因為為空時我們已經處理了,我說的時當back已經走了至少一輪重新回到起點的情況,此時的back-1就成-1了,那我們怎么處理呢?我們要知道,這種情況下的back時已經被取模了k+1后,那我們不妨可以給back-1+k+1再給它取模k+1;即(obj->back-1)+(obj->k+1)%(obj->k+1);怎么理解這個公式,還是那句話,back-1不可能大于k+1,一個數%比他小的數值不變,(a+b)%b,如果a比b小且a是正數,那這個值是不變的,這一種情況也就對應了我們此處back!=0的情況,如果back=0,尾元素就在k的位置,那back-1就是-1,他再加上k+1再%k+1要比k+1小,所以結果就是k那個位置。

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

到這里這道題就大功告成了,此時我們運行,報了一個這樣錯誤

是因為,我們在前面調用了就很多次隊列為空為滿的情況,也沒有聲明,所以我們可以把判斷隊列為空,為滿挪到插入接口前面就可以啦。

好啦,本次題目就到這里了,希望大家能夠多多支持,我們下次再見!

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

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

相關文章

2023亞太杯數學建模A題B題C題選題建議,思路分析,模型代碼

目錄 ABC題思路模型代碼:獲取見文末名片,第一時間更新 視頻連接講解如上 A題思路:采果機器人的圖像識別技術思路模型代碼 B題思路:玻璃溫室中的微氣候法規 C題思路:我國新能源電動汽車的發展趨勢 ABC題思路模型代…

經典雙指針算法試題(二)

📘北塵_:個人主頁 🌎個人專欄:《Linux操作系統》《經典算法試題 》《C》 《數據結構與算法》 ??走在路上,不忘來時的初心 文章目錄 一、有效三角形的個數1、題目講解2、講解算法原理3、代碼實現 二、查找總價格為目標值的兩個商…

Excel使用技巧匯總

1 單元格內換行 altenter

Hutool

一、簡介 Hutool是一個小而全的Java工具類庫,通過靜態方法封裝,降低相關API的學習成本,提高工作效率,使Java擁有函數式語言般的優雅 官方文檔: https://www.hutool.cn/docs/#/ 二、包含組件 一個Java基礎工具類,對文…

allegro畫封裝時使用坐標指令無效

使用坐標指令時顯示:“Pick is outside the extent of the drawing…pick again” 這是因為你放的引腳已經超出你這個繪制界面的定義尺寸,需要到Setup->Design pararmeters…里面去將圖幅改大一點,如下圖所示: 然后點擊Design…

消息中間件——RabbitMQ(三)理解RabbitMQ核心概念和AMQP協議!

前言 本章學習,我們可以了解到以下知識點: 互聯網大廠為什么選擇RabbitMQ?RabbiMQ的高性能之道是如何做到的?什么是AMQP高級協議?AMQP核心概念是什么?RabbitMQ整體架構模型是什么樣子的?Rabbi…

P8599 [藍橋杯 2013 省 B] 帶分數(dfs+全排列+斷點判斷)

思路&#xff1a;1.深度枚舉所有排列情況 2.設置為每個排列設置兩個斷點&#xff0c;分為三部分&#xff1a;a,b,c 3.轉換為乘法判斷條件&#xff0c;滿足加一 代碼如下&#xff1a;&#xff08;可用next_permutation全排列函數代替dfs&#xff09; #include<iostream>…

機器學習調參指南:提升模型性能的關鍵步驟

諸神緘默不語-個人CSDN博文目錄 文章目錄 1. 理解模型的參數和超參數2. 使用網格搜索進行超參數調優3. 隨機搜索4. 貝葉斯優化5. 使用交叉驗證避免過擬合6. 考慮正則化7. 調整學習率和其他優化器參數8. 實驗和記錄9. 模型的早停法10. 總結 在機器學習和深度學習的領域中&#x…

全面的日志監控管理工具

企業網絡由眾多日志源組成。集中監控這些日志源有助于防止數據威脅和網絡攻擊&#xff0c;綜合日志監控解決方案可以自動執行日志管理流程&#xff0c;通過關聯日志來識別惡意活動&#xff0c;并幫助滿足IT合規性要求。 不同類型的日志監控 EventLog Analyzer 綜合日志監控解…

智慧法院檔案數字化解決方案

智慧法院檔案數字化解決方案可以采用以下步驟&#xff1a; 1. 確定數字化目標&#xff1a;明確數字化的目標和范圍&#xff0c;比如將所有的案件相關文件、紙質檔案和材料進行數字化。 2. 確定數字化流程&#xff1a;制定數字化的流程和標準&#xff0c;比如采用哪些設備和軟件…

【Linux 文件傳輸系列 1.1 -- rsync 詳細介紹】

文章目錄 rsync 詳細介紹rsync 基本特性rsync 常用選項rsync 各種是使用示例 rsync 詳細介紹 rsync 是一個在 Linux 和 Unix 系統上廣泛使用的文件同步和傳輸工具。它被設計用于快速高效地同步文件和目錄之間的變化&#xff0c;不論是本地還是通過網絡。rsync 命令有許多選項&…

【C語言】qsort函數

目錄 簡介 頭文件 ?編輯 函數原型&#xff1a; 參數函數如何寫&#xff1a; 參數函數要求&#xff1a; qsort對整性數據的排序&#xff1a; qsort對字符型數據的排序&#xff1a; 對結構體類型的內部元素排序&#xff1a; 函數的底層是以快速排序實現的 但是本文不深入…

rxjs中combineLatest的用法

RxJS中的combineLatest操作符可以用于將多個Observable對象合并成一個新的Observable對象&#xff0c;新的Observable對象的值是由原始Observable對象的最新值組成的一個數組。當任何一個原始Observable對象發出新值時&#xff0c;新的Observable對象的值也會更新。 combineLa…

小黑子—Maven高級

Maven高級篇 二 小黑子的Maven高級篇學習1. 分模塊開發1.1 分模塊開發設計1.2 分模塊開發實現1.2.1 抽取domain層1.2.2 抽取dao層 2. 依賴管理2.1 依賴傳遞2.2 可選依賴2.3 排除依賴 3. 繼承與聚合3.1 聚合3.2 繼承3.3 總結 4. 屬性4.1 配置文件加載屬性4.2 版本管理 5. 多環境…

【開源】基于Vue.js的民宿預定管理系統

項目編號&#xff1a; S 058 &#xff0c;文末獲取源碼。 \color{red}{項目編號&#xff1a;S058&#xff0c;文末獲取源碼。} 項目編號&#xff1a;S058&#xff0c;文末獲取源碼。 目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊2.1 用例設計2.2 功能設計2.2.1 租客角色…

夢開始的地方——Adobe Premiere Pro

今天&#xff0c;我們來說說一款老生常談的相信也是很多人都經常迫切需要的軟件。Adobe Premiere Pro&#xff0c;簡稱Pr&#xff0c;是由Adobe公司開發的一款視頻編輯軟件。 Premiere Pro是視頻編輯愛好者和專業人士必不可少的視頻編輯工具。它可以提升您的創作能力和創作自由…

httpd(Web服務器)

名詞解釋 1、URL&#xff1a;Uniform Resource Locator&#xff0c;統?資源定位符 2、?址格式&#xff1a;<協議>://<主機或主機名>[:port]/<?錄資源,路徑> 3、主機地址/主機名&#xff1a;主機地址是服務器在因特?所在的IP地址。主機名就需要域名解析…

裝飾器設計模式是什么?什么是 Decorator 裝飾器設計模式?Python 裝飾器設計模式示例代碼

什么是 Decorator 裝飾器設計模式&#xff1f; 裝飾器模式是一種結構型設計模式&#xff0c;它允許向現有對象動態地添加新功能&#xff0c;同時不改變其結構。這種模式實現了對對象的包裝&#xff0c;稱為裝飾器&#xff0c;并且可以在運行時動態地添加、修改或刪除對象的行為…

重磅!這本30w人都在看的Python數據分析暢銷書:更新了!

想學習python進行數據分析&#xff0c;這本《利用python進行數據分析》是繞不開的一本書。目前該書根據Python3.10已經更新到第三版。 Python 語言極具吸引力。自從 1991 年誕生以來&#xff0c;Python 如今已經成為最受歡迎的解釋型編程語言。 pandas 誕生于2008年。它是由韋…

NX二次開發UF_CAM_set_clear_plane_data 函數介紹

文章作者&#xff1a;里海 來源網站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CAM_set_clear_plane_data Defined in: uf_cam_planes.h int UF_CAM_set_clear_plane_data(tag_t object_tag, double origin [ 3 ] , double normal [ 3 ] ) overview 概述 De…