C++循環隊列 自定義queue

原理解析

看main部分的注釋,對照著函數,應該能看懂。

#include <iostream>
class Queue {public:static constexpr int MAX_SIZE = 5;int items[MAX_SIZE];int front, rear;Queue() : front(-1), rear(-1) {}void enqueue(int value) {if ((rear + 1) % MAX_SIZE == front) {std::cout << "Queue is full" << std::endl;return;}if (front == -1) {front = rear = 0;} else {rear = (rear + 1) % MAX_SIZE;}items[rear] = value;}int dequeue() {if (front == -1) {std::cout << "Queue is empty" << std::endl;return -1;}int removedItem = items[front];if (front == rear) {front = rear = -1;} else {front = (front + 1) % MAX_SIZE;}return removedItem;}void display() {if (front == -1) {std::cout << "Queue is empty" << std::endl;return;}int i = front;while (true) {std::cout << items[i] << " ";if (i == rear) break;i = (i + 1) % MAX_SIZE;}std::cout << std::endl;}
};
int main() {Queue q;// 插入第1個值,放在索引為0的位置q.enqueue(11);std::cout << "front:" << q.front << " rear:" << q.rear << std::endl;// 每插入1個值,rear前進1位q.enqueue(21);std::cout << "front:" << q.front << " rear:" << q.rear << std::endl;q.enqueue(31);q.enqueue(41);q.enqueue(51);std::cout << "front:" << q.front << " rear:" << q.rear << std::endl;// 插入5個值后,rear為4,數組已滿// 每次插入前會先檢查rear的下一位是否有空位,現在rear的下一位回到了索引0,而索引0現在被front占用,所以沒有空位。q.enqueue(61); // 插入失敗// 每刪除1個值,front前進1位q.dequeue();std::cout << "front:" << q.front << " rear:" << q.rear << std::endl;q.dequeue();q.dequeue();q.dequeue();std::cout << "front:" << q.front << " rear:" << q.rear << std::endl;// 刪除4個值后,front為4// 每次刪除前會先檢查front是否等于rear,如果等于說明只剩最后1個值了,再次刪除就是清空數組q.dequeue();// 已經是空數組 不能再刪除q.dequeue(); // 刪除失敗std::cout << std::endl;// 插入3個后rear為2q.enqueue(12);q.enqueue(22);q.enqueue(32);std::cout << "front:" << q.front << " rear:" << q.rear << std::endl;// 刪掉1個后front為1q.dequeue();std::cout << "front:" << q.front << " rear:" << q.rear << std::endl;q.enqueue(42);q.enqueue(52);std::cout << "front:" << q.front << " rear:" << q.rear << std::endl;// 此時rear為4,rear的下一位回到索引0,此時front為1,并沒有占用索引0,所以后面還能插入q.enqueue(62);std::cout << "front:" << q.front << " rear:" << q.rear << std::endl;// 現在rear為0,下一位是1,但1被front占用,數組滿了,不能再插入q.enqueue(72); // 插入失敗std::cout << std::endl;// 打印數組 從front開始到rear 每次循環索引步進1q.dequeue();q.dequeue();q.enqueue(13);std::cout << "front:" << q.front << " rear:" << q.rear << std::endl;// 現在front=3,rear=1,當索引步進到1時,說明打印完了,退出循環。q.display();return 0;
}

包裝都頭文件

實際使用要修改的地方,數組的大小,數組的類型。
還有插入函數的參數類型,刪除函數的返回類型,都要改成數組中的元素類型。

// Queue.h
#ifndef QUEUE_H
#define QUEUE_H
#include <iostream>
class Queue {private:static constexpr int MAX_SIZE = 5;int items[MAX_SIZE];int front, rear;public:Queue() : front(-1), rear(-1) {}void enqueue(int value) {if ((rear + 1) % MAX_SIZE == front) {std::cout << "Queue is full" << std::endl;return;}if (front == -1) {front = rear = 0;} else {rear = (rear + 1) % MAX_SIZE;}items[rear] = value;}int dequeue() {if (front == -1) {std::cout << "Queue is empty" << std::endl;return -1;}int removedItem = items[front];if (front == rear) {front = rear = -1;} else {front = (front + 1) % MAX_SIZE;}return removedItem;}void display() {if (front == -1) {std::cout << "Queue is empty" << std::endl;return;}int i = front;while (true) {std::cout << items[i] << " ";if (i == rear)break;i = (i + 1) % MAX_SIZE;}std::cout << std::endl;}
};
#endif

調用

// main.cpp
#include "Queue.h"
int main() {Queue q;q.enqueue(10);q.enqueue(20);q.enqueue(30);q.display();std::cout << "Dequeued: " << q.dequeue() << std::endl; // 獲取刪除的值 也就是先進先出std::cout << "Dequeued: " << q.dequeue() << std::endl;q.display();q.enqueue(40);q.display();std::cout << "Dequeued: " << q.dequeue() << std::endl;std::cout << "Dequeued: " << q.dequeue() << std::endl;std::cout << "Dequeued: " << q.dequeue() << std::endl; // 刪除失敗return 0;
}

優化

最好改成類模版,實際使用中不需要打印函數,插入函數的參數可以改成引用。刪除元素的返回值因為是局部變量,無法用移動語義優化。

如果對性能要求不高,可以把數組改成std::vector,這樣在構造對象時就可以指定數組大小。這里更注重性能,所以手動修改數組大小。

// Queue.h
#ifndef QUEUE_H
#define QUEUE_H
#include <iostream>
#include <utility>
template <typename T> class Queue {private:static constexpr int MAX_SIZE = 1000;T items[MAX_SIZE];int front, rear;public:Queue() : front(-1), rear(-1) {}void enqueue(const T &value) {if ((rear + 1) % MAX_SIZE == front) {std::cout << "Queue is full" << std::endl;return;}if (front == -1) {front = rear = 0;} else {rear = (rear + 1) % MAX_SIZE;}items[rear] = value;}T dequeue() {if (front == -1) {std::cout << "Queue is empty" << std::endl;return T{};}T removedItem = items[front];if (front == rear) {front = rear = -1;} else {front = (front + 1) % MAX_SIZE;}return removedItem;}
};
#endif

測試

#include "Queue.h"
#include <chrono>
#include <iostream>struct bar {float open;float height;float low;float close;
};int main() {Queue<bar> q;bar b1 = {10.0f, 15.0f, 8.0f, 12.0f};bar b2 = {20.0f, 16.0f, 9.0f, 13.0f};q.enqueue(b1);q.enqueue(b2);q.enqueue({30, 17, 10, 14}); // 直接使用初始化列表傳入參數q.enqueue({40.2, 18.2, 19.2, 15.2});std::cout << q.dequeue().close << std::endl;std::cout << q.dequeue().close << std::endl;std::cout << q.dequeue().close << std::endl;std::cout << q.dequeue().close << std::endl; // 數組清空std::cout << q.dequeue().close << std::endl; // 刪除失敗return 0;
}

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

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

相關文章

理解 Vue.js 中的 immediate: true

理解 Vue.js 中的 immediate: true 在使用 Vue.js 時&#xff0c;監聽器 (watchers) 是一種非常重要的工具&#xff0c;它允許我們觀察和響應數據的變化。在定義監聽器時&#xff0c;我們通常會在組件的 watch 選項中添加相關配置。immediate: true 是其中的一個配置選項。本文…

無線通訊幾種常規天線類別簡介

天線對于無線模塊來說至關重要&#xff0c;合適的天線可以優化通信網絡&#xff0c;增加其通信的范圍和可靠性。天線的選型對最后的模塊通信影響很大&#xff0c;不合適的天線會導致通信質量下降。針對不同的市場應用&#xff0c;天線的材質、安置方式、性能也大不一樣。下面簡…

近期計算機領域的熱點技術

隨著科技的飛速發展&#xff0c;計算機領域的新技術、新趨勢層出不窮。本文將探討近期計算機領域的幾個熱點技術趨勢&#xff0c;并對它們進行簡要的分析和展望。 一、人工智能與機器學習 人工智能&#xff08;AI&#xff09;和機器學習&#xff08;ML&#xff09;是近年來計算…

基于Vue 3.x與TypeScript的PPTIST本地部署與無公網IP遠程演示文稿

文章目錄 前言1. 本地安裝PPTist2. PPTist 使用介紹3. 安裝Cpolar內網穿透4. 配置公網地址5. 配置固定公網地址 前言 本文主要介紹如何在Windows系統環境本地部署開源在線演示文稿應用PPTist&#xff0c;并結合cpolar內網穿透工具實現隨時隨地遠程訪問與使用該項目。 PPTist …

[gpt胡說八道篇] 使用Docker快速啟動Doris

Docker 是一種輕量級的虛擬化技術&#xff0c;我們可以利用 Docker 快速的在本地啟動一個 Doris 的實例&#xff0c;方便進行開發和測試。下面我們來看一下如何操作。 1. 拉取 Docker 鏡像 首先&#xff0c;我們需要從 Docker Hub 上拉取 Doris 的鏡像。打開終端&#xff0c;輸…

Qt Qvariant

QVariant 是 Qt 框架中的一個非常強大的類&#xff0c;它用于存儲各種不同類型的數據&#xff0c;并提供了一種統一的方式來處理這些數據。QVariant 可以存儲大多數基本數據類型&#xff0c;如整數、浮點數、字符串、日期時間等&#xff0c;以及更復雜的數據類型&#xff0c;如…

ChatGPT的原理可以通俗易懂地介紹

ChatGPT的原理可以通俗易懂地介紹如下&#xff1a; 基礎架構&#xff1a; ChatGPT基于OpenAI的GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型&#xff0c;尤其是GPT-3的架構進行構建。GPT模型是一種基于Transformer架構的預訓練語言模型&#xff0c;特別…

基于STM32的智能水質監測系統

目錄 引言環境準備智能水質監測系統基礎代碼實現&#xff1a;實現智能水質監測系統 4.1 數據采集模塊4.2 數據處理與分析4.3 控制系統實現4.4 用戶界面與數據可視化應用場景&#xff1a;水質管理與優化問題解決方案與優化收尾與總結 1. 引言 智能水質監測系統通過使用STM32嵌…

RISC-V知識總結 —— 向量(擴展)指令集

資源1:晏明 - RISC-V向量擴展指令架構及LLVM自動向量化支持 - 202112118 - 第13屆開源開發工具大會&#xff08;OSDTConf2021&#xff09;_嗶哩嗶哩_bilibili資源2:張先軼 - 基于RISC-V向量指令集優化基礎計算軟件生態【第12屆開源開發工具大會&#xff08;OSDT2020&#xff09…

設計模式(實際項目)-狀態機模式

需求背景&#xff1a;存在狀態流轉的預約單 一.數據庫設計 CREATE TABLE appointment (id bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 主鍵id,appoint_type int(11) NOT NULL COMMENT 預約類型(0:線下查房...),appoint_user_id bigint(20) NOT NULL COMMENT 預約人…

研導智能科技——AI輔助科研產品開發

人工智能&#xff08;AI&#xff09;技術的飛速發展為科研領域帶來了革命性的變化。本公司致力于開發基于人工智能的科研輔助產品&#xff0c;旨在通過智能化手段提高科研人員的工作效率和研究質量。目前&#xff0c;我們成功開發了研導學術平臺&#xff08;www.zhiyanxueshu.c…

Linux運維:MySQL數據庫(1)

1.信息與數據&#xff1a; 數據是信息的載體&#xff0c;信息是數據的內涵。數據庫就是存儲數據的倉庫&#xff0c;并長期存儲在計算機磁盤中&#xff0c;可由多個用戶和應用程序共享的數據集合&#xff0c;就是數據庫。 2.數據庫中的數據的特點&#xff1a; 2.1.數據是按照某…

RuleApp1.4.6文章社區客戶端 廣告聯盟支持Docx導入

支持編譯為安卓&#xff0c;蘋果&#xff0c;小程序&#xff0c;H5網頁的社區客戶端代碼&#xff0c;包括文章模塊&#xff0c;用戶模塊&#xff0c;動態模塊&#xff0c;支付模塊&#xff0c;聊天模塊&#xff0c;廣告模塊&#xff0c;商城模塊等基礎功能&#xff0c;包含VIP會…

C++的模板(九):模板的實例化問題

前文子系統中的例子&#xff0c; SubSystem內部用了STL庫的map模板: template <class Event, class Response> class SubSystem{ public:map<Event*, Response*> table; public:void bind(Event *e, Response *r);void unbind(Event *e); public:int OnMessage(E…

10位時間戳、13位時間戳、17位時間戳,以及在JavaScript中的格式轉換

一、介紹 1、10位時間戳 2、13位時間戳 3、17位時間戳 4、時間戳轉換工具 二、13位時間戳的轉換 1、轉標準日期 2、轉格式化日期 三、10位時間戳的轉換 1、轉標準日期 2、轉格式化日期 四、17位時間戳的轉換 1、解析思路 2、解析過程 &#xff08;1&#xff09;統…

C++系統編程篇——Linux第一個小程序--進度條

&#xff08;1&#xff09;先引入一個概念&#xff1a;行緩沖區 \r和\n \r表示回車 \n表示回車并換行 ①代碼一 #include<stdio.h> #include<unistd.h> int main()…

django學習入門系列之第三點《偽類簡單了解》

文章目錄 hover&#xff08;偽類&#xff09;after&#xff08;偽類&#xff09;往期回顧 hover&#xff08;偽類&#xff09; 偽類指的是用冒號加的 hover樣式指的是&#xff0c;當用戶光標移動到設定區域后&#xff0c;所執行的用法 如&#xff1a; <!DOCTYPE html>…

【C語言】函數無參數有返回值、有參數無返回值、有參數有返回值

文章目錄 前言C語言函數的分類和使用無參數有返回值的函數有參數無返回值的函數有參數有返回值的函數 總結 前言 在C語言中&#xff0c;函數是一種重要的組織代碼的方式。根據函數的參數和返回值&#xff0c;我們可以將函數分為三類&#xff1a;無參數有返回值、有參數無返回值…

清理未使用的鏡像和容器

刪除未使用的鏡像和容器&#xff1a; docker system prune -a清理構建緩存&#xff1a; Docker 會緩存構建過程中使用的中間鏡像&#xff0c;可以通過以下命令清理它們&#xff1a; docker builder prune定期清理舊鏡像&#xff1a; 定期運行以下命令清理舊鏡像&#xff1a; …

通過代理從ARDUINO IDE直接下載開發板包

使用免費代理 實現ARDUINO IDE2.3.2 下載ESP8266/ESP32包 免費代理 列表 測試代理是否可用的 網站 有時&#xff0c;代理是可用的&#xff0c;但依然有可能找不到開發板管理器的資料包。 可以多換幾個代理試試。 代理的配置 文件 -> 首選項 -> 網絡 進入后做如下配置…