C++ STL 環形隊列模擬實現

C++ STL 環形隊列模擬實現

下面是一個使用C++ STL實現的環形隊列(Circular Queue)的完整示例:

#include <iostream>
#include <vector>
#include <stdexcept>template <typename T>
class CircularQueue {
private:std::vector<T> data;  // 使用vector作為底層存儲size_t front;         // 隊頭指針size_t rear;          // 隊尾指針size_t currentSize;    // 當前隊列中元素數量size_t capacity;       // 隊列容量public:// 構造函數,初始化隊列容量explicit CircularQueue(size_t size) : data(size), front(0), rear(0), currentSize(0), capacity(size) {}// 判斷隊列是否為空bool isEmpty() const {return currentSize == 0;}// 判斷隊列是否已滿bool isFull() const {return currentSize == capacity;}// 獲取隊列當前元素數量size_t size() const {return currentSize;}// 入隊操作void enqueue(const T& item) {if (isFull()) {throw std::overflow_error("Queue is full");}data[rear] = item;rear = (rear + 1) % capacity;++currentSize;}// 出隊操作T dequeue() {if (isEmpty()) {throw std::underflow_error("Queue is empty");}T item = data[front];front = (front + 1) % capacity;--currentSize;return item;}// 查看隊首元素T peek() const {if (isEmpty()) {throw std::underflow_error("Queue is empty");}return data[front];}// 打印隊列內容(用于調試)void print() const {if (isEmpty()) {std::cout << "Queue is empty" << std::endl;return;}std::cout << "Queue contents: ";size_t i = front;for (size_t count = 0; count < currentSize; ++count) {std::cout << data[i] << " ";i = (i + 1) % capacity;}std::cout << std::endl;}
};int main() {// 創建一個容量為5的環形隊列CircularQueue<int> queue(5);// 測試入隊操作queue.enqueue(10);queue.enqueue(20);queue.enqueue(30);queue.enqueue(40);queue.enqueue(50);queue.print();  // 輸出: 10 20 30 40 50// 測試隊列已滿try {queue.enqueue(60);} catch (const std::overflow_error& e) {std::cout << "Error: " << e.what() << std::endl;}// 測試出隊操作std::cout << "Dequeued: " << queue.dequeue() << std::endl;  // 輸出: 10std::cout << "Dequeued: " << queue.dequeue() << std::endl;  // 輸出: 20queue.print();  // 輸出: 30 40 50// 測試環形特性queue.enqueue(60);queue.enqueue(70);queue.print();  // 輸出: 30 40 50 60 70// 測試查看隊首元素std::cout << "Front element: " << queue.peek() << std::endl;  // 輸出: 30// 測試隊列空的情況while (!queue.isEmpty()) {queue.dequeue();}try {queue.dequeue();} catch (const std::underflow_error& e) {std::cout << "Error: " << e.what() << std::endl;}return 0;
}

實現說明

  1. 底層存儲:使用std::vector作為底層容器存儲隊列元素。

  2. 關鍵指針

    • front:指向隊列第一個元素
    • rear:指向隊列下一個插入位置
    • currentSize:記錄當前隊列中元素數量
    • capacity:隊列的總容量
  3. 環形特性:通過模運算實現指針的循環移動:

    rear = (rear + 1) % capacity;
    front = (front + 1) % capacity;
    
  4. 主要操作

    • enqueue():向隊尾添加元素
    • dequeue():從隊首移除元素
    • peek():查看隊首元素但不移除
    • isEmpty()/isFull():檢查隊列狀態
  5. 異常處理:當隊列滿時入隊或隊列空時出隊會拋出相應異常。

這個實現充分利用了STL的vector容器,同時通過模運算實現了環形隊列的特性,避免了普通隊列在出隊后空間無法再利用的問題。

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

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

相關文章

部署rocketmq集群

容器化部署RocketMQ5.3.1集群 背景: 生產環境單機的MQ不具有高可用,所以我們應該部署成集群模式,這里給大家部署一個雙主雙從異步復制的Broker集群 一、安裝docker yum install -y docker systemctl enable docker --now # 單機部署參考: https://www.cnblogs.com/hsyw/p/1…

mysql的函數(第一期)

一、字符串函數?? 處理文本數據&#xff0c;常用函數&#xff1a; ??CONCAT(str1, str2, ...)?? ??作用??&#xff1a;拼接字符串。??示例??&#xff1a;SELECT CONCAT(Hello, , World); → Hello World??注意??&#xff1a;若任一參數為 NULL&#xff0c;…

Linux下的網絡管理

注意&#xff1a;本文使用的Linux系統版本為Red Hat Enterprise Linux 9 (RHEL 9)。 在RHEL9上&#xff0c;使用NM&#xff08;NetworkManager&#xff09;進行網絡配置&#xff0c;ifcfg &#xff08;也稱為 文件&#xff09;將不再是網絡配置文件的主存儲。雖然 ifcfg 樣式仍…

游戲引擎學習第233天

原地歸并排序地方很蒙圈 game_render_group.cpp&#xff1a;注意當前的SortEntries函數是O(n^2)&#xff0c;并引入一個提前退出的條件 其實我們不太討論這些話題&#xff0c;因為我并沒有深入研究過計算機科學&#xff0c;所以我也沒有太多內容可以分享。但希望在過去幾天里…

從《周游記3》演繹歌劇版《菊花臺》,周杰倫婚禮曲目意大利文版驚喜亮相

今天&#xff08;4月19日&#xff09;22:00&#xff0c;由魔胴西西里咖啡冠名的戶外實境互動綜藝《周游記3》第四期即將播出。本期節目中&#xff0c;“J式之旅”發起人周杰倫和林暐恒、杜國璋、陳冠霖、陳冠廷&#xff0c;將繼續意大利之旅&#xff0c;從那不勒斯的百年老店到…

Linux系統編程 day6 進程間通信mmap

父子共享的信息&#xff1a;文件描述符&#xff0c;mmap建立的共享映射區&#xff08;MAP_SHARED&#xff09; mmap父子間進程通信 var的時候 &#xff1a;讀時共享&#xff0c;寫時復制 父進程先創建映射區&#xff0c;指定共享MAP_SHARED權限 &#xff0c; fork創建子進程…

opencv--圖像處理

圖像處理技術 圖像處理技術是利用計算機對圖像進行計算,分析和處理的技術,包括數字圖像處理和計算機視覺兩大領域。 對圖像的處理包括濾波,縮放,分割,識別(兩種信息對比)等。 鏈接 數字圖像處理 1. 數字圖像處理(Digital Image Processing) 數字圖像處理主要關注圖…

Spring 學習筆記之 @Transactional詳解

一、數據庫事務基礎 數據庫事務&#xff08;Transaction&#xff09;是數據庫管理系統中用于確保數據一致性和完整性的一種機制。它是一組操作的集合&#xff0c;這些操作要么全部成功&#xff0c;要么全部失敗&#xff0c;從而保證數據庫狀態的正確性。 1.1 事務的基本概念 定…

【Openlayers】Openlayers 入門教程

Openlayers 入門教程 -系列文章列表 openlayers 入門教程&#xff08;一&#xff09;&#xff1a;openlayers簡介 openlayers 入門教程&#xff08;二&#xff09;&#xff1a;Map 篇 openlayers 入門教程&#xff08;三&#xff09;&#xff1a;View 篇 openlayers 入門教程&a…

【Lua語言】Lua語言快速入門

初始Lua Lua是一種輕量小巧的腳本語言&#xff0c;他使用標準C語言編寫并以源代碼形式開放。這意味著Lua虛擬機可以很方便的嵌入別的程序中&#xff0c;從而為應用程序提供靈活的擴展和定制功能。同時&#xff0c;在目前腳本引擎中&#xff0c;Lua的運行速度占有絕對優勢。 變…

車載診斷新架構--- SOVD初入門(上)

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 周末洗了一個澡,換了一身衣服,出了門卻不知道去哪兒,不知道去找誰,漫無目的走著,大概這就是成年人最深的孤獨吧! 舊人不知我近況,新人不知我過…

linux查看目錄相關命令

查看目錄命令 學習目標 能夠使用Linux命令查看目錄信息 1. 查看目錄命令的使用 命令說明ls查看當前目錄信息tree以樹狀方式顯示目錄信息 ls命令效果圖: tree命令效果圖: 2. 查看當前目錄路徑 命令說明pwd查看當前目錄路徑 pwd命令效果圖: 3. 清除終端內容 命令說明clear…

JavaScript中的Event事件對象詳解

一、事件對象&#xff08;Event&#xff09;概述 1. 事件對象的定義 event 對象是瀏覽器自動生成的對象&#xff0c;當用戶與頁面進行交互時&#xff08;如點擊、鍵盤輸入、鼠標移動等&#xff09;&#xff0c;事件觸發時就會自動傳遞給事件處理函數。event 對象包含了與事件…

OSPF綜合實驗(HCIP)

1&#xff0c;R5為ISP&#xff0c;其上只能配置Ip地址&#xff1b;R4作為企業邊界路由器&#xff0c; 出口公網地址需要通過ppp協議獲取&#xff0c;并進行chap認證 2&#xff0c;整個OSPF環境IP基于172.16.0.0/16劃分&#xff1b; 3&#xff0c;所有設備均可訪問R5的環回&…

2024-04-19| Java: Documented注解學習 JavaDoc

在 Java 中&#xff0c;Documented 是一個元注解&#xff08;meta-annotation&#xff09;&#xff0c;用于標記其他注解&#xff0c;表明這些注解應該被包含在 JavaDoc 文檔中。以下是關于 Documented 注解的作用的簡要說明&#xff1a; 作用 記錄注解信息到 JavaDoc&#x…

15.Chromium指紋瀏覽器開發教程之WebAudio指紋定制

WebAudio指紋概述 瀏覽器中的 WebAudio API 提供了豐富的功能&#xff0c;其中包括了大量生成和處理音頻數據的API。WebAudio API 的音頻指紋技術是一種利用音頻信號的特征來唯一標識音頻的技術。因為WebAudio API 提供了豐富的音頻處理功能&#xff0c;包括合成、過濾、分析等…

2025年贛教云智慧作業微課PPT模板

江西的老師們注意&#xff0c;2025年贛教云智慧作業微課PPT模版和往年不一樣&#xff0c;千萬不要搞錯了&#xff0c;圖上的才是正確的2025年的贛教云智慧作業微課PPT模版&#xff0c;贛教云智慧作業官網有問題&#xff0c;無法正確下載該模板&#xff0c;需要該模板的&#xf…

2.5.1DOS下常用工具 curl,netstat,telnet命令使用

curl命令 Win10及以上系統默認已安裝Curl&#xff0c;打開命令提示符輸入 curl --help&#xff0c;若顯示幫助信息則無需安裝 ??手動安裝方法?? 官網下載&#xff1a;訪問 curl官網 選擇Windows版本curl for Windows若需在 Windows XP 等舊系統使用&#xff0c;需選擇更…

使用Redis實現實時排行榜

為了實現一個實時排行榜系統&#xff0c;我們可以使用Redis的有序集合&#xff08;ZSet&#xff09;&#xff0c;其底層通常是使用跳躍表實現的。有序集合允許我們按照分數&#xff08;score&#xff09;對成員&#xff08;member&#xff09;進行排序&#xff0c;因此非常適合…

Linux——firewalld防火墻(筆記)

目錄 一&#xff1a;Firewalld防火墻的概述 &#xff08;1&#xff09;firewalld簡介 &#xff08;2&#xff09;firewalld&iptables的關系 &#xff08;3&#xff09;firewalld與iptables service的區別 1. ?規則管理方式? 2. ?默認策略與設計邏輯? 3. ?配置文…