C++刷題(二):棧 + 隊列

📝前言說明:
本專欄主要記錄本人的基礎算法學習以及刷題記錄,使用語言為C++。
每道題我會給出LeetCode上的題號(如果有題號),題目,以及最后通過的代碼。沒有題號的題目大多來自牛客網。對于題目的講解,主要是個人見解,如有不正確,歡迎指正,一起進步!

🎬個人簡介:努力學習ing
📋本專欄:C++刷題專欄
📋其他專欄:C++學習筆記,C語言入門基礎,python入門基礎,python刷題專欄
🎀CSDN主頁 愚潤澤

題目

  • 20. 有效的括號
  • 225. 用隊列實現棧
  • 232. 用棧實現隊列
  • 622. 設計循環隊列
  • 面試題03.05. 棧排序

20. 有效的括號

經典的括號匹配題:利用棧。遇到左括號:入棧,遇到右括號:出棧
不過寫代碼時要注意:因為我們要讓'(' 匹配 ')',所以遇到左括號時,直接將它對應的右括號入棧,后續可以直接字符比較判斷。
在這里插入圖片描述

class Solution {
public:bool isValid(string s) {stack<char> st;for(auto ch : s){if(ch == '('){st.push(')'); // 需要匹配的}else if (ch == '['){st.push(']');}else if (ch == '{'){st.push('}');}else{if( st.empty() || ch != st.top()){ // 這里要先判斷棧是否為空return false;}st.pop();}}return st.empty();}
};

225. 用隊列實現棧


首先我們要了解棧的特點:先進后出,隊列的特點:先進先出
因此,這道題的難點在于:如何讓新入隊的元素處于隊頭?

這道題給了我們兩個隊列,如果將一個隊列當做主隊列(即棧),另一個隊列作為輔助隊列,我們就可以利用輔助隊列來改變新入隊的元素的位置:
前提:每次操作前,輔助隊列要為空。
思想:如果直接讓新元素進主隊列,那這個元素肯定是最后一個了,但是直接讓新元素進輔助隊列,那這個新元素就是輔助的第一個元素。所以我們先讓新元素進入輔助隊列,然后再把主隊列(棧)里的元素依次出棧放入輔助隊列,這樣在輔助隊列里新元素第一個出隊列,而其他元素的出隊列順序與原來的主隊列(棧)保持一致。這時候我們再交換輔助隊列和主隊列的身份。

class MyStack {
public:queue<int> queue1; queue<int> queue2; MyStack() {}void push(int x) {queue2.push(x); // 把新元素放到輔助隊列while(!queue1.empty()){queue2.push(queue1.front()); // 依次將棧的元素放入輔助隊列queue1.pop();}swap(queue1, queue2);}int pop() {int r = queue1.front();queue1.pop();return r;}int top() {return queue1.front();}bool empty() {return queue1.empty();}
};/*** Your MyStack object will be instantiated and called as such:* MyStack* obj = new MyStack();* obj->push(x);* int param_2 = obj->pop();* int param_3 = obj->top();* bool param_4 = obj->empty();*/

232. 用棧實現隊列

在這里插入圖片描述
只需要讓一個棧進,一個棧負責出就行了。當一個棧的元素全部倒入另一個棧,這時候元素的出入順序就會完全改變一次。(為了節約時間,我們只在outStack里面元素徹底為空且遇到出棧需求時,才將inStack的數據倒入`outStack)

class MyQueue {
public:stack<int> inStack, outStack;void in_to_out(){ // 倒轉while(!inStack.empty()){outStack.push(inStack.top());inStack.pop();}}MyQueue() {}void push(int x) {inStack.push(x);}int pop() {if(outStack.empty()){in_to_out();}int r = outStack.top();outStack.pop(); return r;}int peek() {if(outStack.empty()){in_to_out();}return outStack.top();}bool empty() {return inStack.empty() && outStack.empty();}
};/*** Your MyQueue object will be instantiated and called as such:* MyQueue* obj = new MyQueue();* obj->push(x);* int param_2 = obj->pop();* int param_3 = obj->peek();* bool param_4 = obj->empty();*/

622. 設計循環隊列

在這里插入圖片描述
下面解法以數組為例:
環形隊列的關鍵在于:1,如何通過取模來達到走環的效果;2,如何判斷隊列滿和空的情況。
對于循環:當一個數+1時可能超出最大值,則需要%來控制此數的大小任然在下標范圍內;
對于判空:起始時front指針和rear指針都指向空;對于滿,我們可以犧牲一個空間,即:當rear+1 == front的時候為滿(但注意rear + 1要確保在數組下標內)。
下面做法以front的后一位為第一個數據位為例:

class MyCircularQueue {
public:// 用數組來模擬循環隊列,讓front指向的位置為空,front下一個位置才有節點// front == rear時為空,當 rear + 1 == front 時為滿 MyCircularQueue(int k) {capacity = k;front = rear = 0;que = vector<int> (k+1); // 比容量多開一個空間,則數組下標為[0, k](后續我們要讓rear和front的下標在這個范圍內,不然會越界)}bool enQueue(int value) {if(isFull()){return false;}rear = (rear + 1) % (capacity + 1);  que[rear] = value;return true;}bool deQueue() {if(isEmpty()){return false;}front = (front + 1) % (capacity + 1);return true;}int Front() {if(isEmpty()){return -1;}return que[(front + 1) % (capacity + 1)];}int Rear() {if(isEmpty()){return -1;}return que[rear];}bool isEmpty() {return rear == front;}bool isFull() {return ((rear + 1) % (capacity + 1)) == front;}private:int front;int rear;int capacity;vector<int> que;
};/*** Your MyCircularQueue object will be instantiated and called as such:* MyCircularQueue* obj = new MyCircularQueue(k);* bool param_1 = obj->enQueue(value);* bool param_2 = obj->deQueue();* int param_3 = obj->Front();* int param_4 = obj->Rear();* bool param_5 = obj->isEmpty();* bool param_6 = obj->isFull();*/

面試題03.05. 棧排序

在這里插入圖片描述
這道題的題目表述不清楚,看示例可以發現,實際上是往棧里面插入元素,要保證插入后的順序從棧底到棧頂是從大到小的。
我們只需要將每次要插入的元素和棧中已經有的元素作比較,找到合適的位置插入。
如:棧頂元素為t,要插入元素為val,如果val < t,就直接入棧,否則,先讓t進入輔助棧,重復此過程,直到找到合適的位置插入,插入完后,把st2的元素倒回來。

class SortedStack {
public:SortedStack() {}void push(int val) {while( !st1.empty() && st1.top() < val){st2.push(st1.top()); // 把st1的元素暫存到st2st1.pop();}st1.push(val);// 把st2的元素倒回來while(!st2.empty()){st1.push(st2.top());st2.pop();}}void pop() {if(!st1.empty()){st1.pop();}}int peek() {if(!st1.empty()){return st1.top();}return -1;}bool isEmpty() {return st1.empty();}
private:stack<int> st1, st2;
};/*** Your SortedStack object will be instantiated and called as such:* SortedStack* obj = new SortedStack();* obj->push(val);* obj->pop();* int param_3 = obj->peek();* bool param_4 = obj->isEmpty();*/

🌈我的分享也就到此結束啦🌈
要是我的分享也能對你的學習起到幫助,那簡直是太酷啦!
若有不足,還請大家多多指正,我們一起學習交流!
📢公主,王子:點贊👍→收藏?→關注🔍
感謝大家的觀看和支持!祝大家都能得償所愿,天天開心!!!

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

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

相關文章

精通游戲測試筆記(持續更新)

第一章、游戲測試的兩條規則 不要恐慌 不要將這次發布當作最后一次發布 不要相信任何人 把每次發布當作最后一次發布 第二章&#xff1a;成為一名游戲測試工程師

Windows功能之FTP服務器搭建

一、創作背景 之前有用linux系統搭建過ftp服務器&#xff0c;最近想著用windows系統也順便搭建一個&#xff0c;看網上有第三方服務軟件一鍵部署&#xff0c;記得windows可以不借助第三方軟件就可以搭建&#xff0c;就想順便操作試試&#xff0c;結果老是連接不上&#xff0c;費…

星型組網模塊的兩種交互方式優缺點解析

星型組網模塊簡介 星型組網模塊工作在433MHz頻段&#xff1b;星型組網模塊集主機&#xff08;協調器&#xff09;、終端為一體&#xff0c;星型組網模塊具有長距離、高速率兩種傳輸模式&#xff0c;一個主機&#xff08;協調器&#xff09;支持多達200個節點與其通訊&#xff0…

二分+前綴和——森林的最大美麗值

森林的最大美麗值(二分差分數組) 題目分析 求最小值的最大值&#xff0c;聯想到二分。 第一階段二段性分析 對于所有樹的高度都可以大于等于mid&#xff0c;那么我們可以確定高度小于mid的值一定也可以&#xff0c;但是此時我需要找的是最大的高度&#xff0c;那么mid一定比…

Pytorch實現之最小二乘梯度歸一化設計

簡介 簡介:LSGAN提出了一種利用最小二乘法來計算兩個數據分布之間的距離,該論文在此基礎上采用梯度歸一化來進一步穩定訓練。 論文題目:LSN-GAN: A Novel Least Square Gradient Normalization for Generative Adversarial Networks(LSN-GAN:一種新的生成對抗網絡的最小…

JavaScript基礎-全局作用域

在JavaScript編程中&#xff0c;理解變量的作用域是編寫高效、可維護代碼的關鍵之一。全局作用域是指變量在整個程序范圍內都可訪問的狀態&#xff0c;這意味著它們可以在任何函數或代碼塊中被讀取和修改。然而&#xff0c;過度使用全局變量也可能導致一些問題&#xff0c;如命…

【2025.3.13】記一次雙系統筆記本加裝固態硬盤記錄 linux擴容 linux更換/home和/opt所在硬盤 windows無法調整亮度

文章目錄 &#x1f315;事情經過&#x1f315;更換/home和/opt的掛載硬盤&#x1f319;目的&#x1f319;初始化1t固態硬盤&#x1f319;打開Linux查看硬盤信息&#x1f319;給新1t固態硬盤分區&#x1f319;格式化分區&#x1f319;把新1t固態硬盤先掛載到/mnt/ssd_1t 用于后續…

山東省新一代信息技術創新應用大賽-計算機網絡管理賽項(樣題)

目錄 競賽試題 網絡拓撲 配置需求 虛擬局域網 IPv4地址部署 OSPF及路由部署 配置合適的靜態路由組網 MSTP及VRRP鏈路聚合部署 IPSEC部署 路由選路部署 設備與網絡管理部署 1.R1 2.R2 3.S1 4.S2 5.S3 競賽試題 本競賽使用HCL(華三云實驗室)來進行網絡設備選擇…

【測試語言基礎篇】Python基礎之List列表

一、Python 列表(List) 序列是Python中最基本的數據結構。序列中的每個元素都分配一個數字 - 它的位置&#xff0c;或索引&#xff0c;第一個索引是0&#xff0c;第二個索引是1&#xff0c;依此類推。 Python有6個序列的內置類型&#xff0c;但最常見的是列表和元組。序列都可…

大數據面試之路 (二) hive小文件合并優化方法

大量小文件容易在文件存儲端造成瓶頸&#xff0c;影響處理效率。對此&#xff0c;您可以通過合并Map和Reduce的結果文件來處理。 一、合并小文件的常見場景 寫入時產生小文件&#xff1a;Reduce任務過多或數據量過小&#xff0c;導致每個任務輸出一個小文件。 動態分區插入&…

MySQL 批量插入 vs 逐條插

MySQL 插入數據&#xff1a;批量插入 vs 逐條插入&#xff0c;哪個更快&#xff1f; 在 MySQL 中&#xff0c;插入數據有兩種常見方式&#xff1a; 批量插入&#xff1a;一條 SQL 插入多條數據。逐條插入&#xff1a;每次插入一條數據。 這兩種方式有什么區別&#xff1f;哪…

Docker基礎命令說明

Docker基礎操作命令眾多&#xff0c;這些命令可以按如下方式進行分類&#xff1a; 鏡像操作容器操作網絡操作數據卷操作LOG查詢 等方面進行分類。 一、鏡像操作命令 docker images&#xff1a;用于列出本地系統中所有的 Docker 鏡像。鏡像就像是一個模板&#xff0c;它包含…

AI重構私域增長:從流量收割到終身價值運營的三階躍遷

私域運營的AI進化論&#xff1a;內容即服務的三個階段 隨著企業微信生態的成熟&#xff0c;私域運營正經歷從"流量收割"到"關系養成"的本質轉變。在AIGC技術的推動下&#xff0c;2024年私域場景正式進入**"內容即服務"**的價值共創期&#xff1…

Linux date 命令使用指南

date 命令用于 顯示或設置系統日期和時間&#xff0c;支持靈活的時間格式化和計算。以下是常用場景與詳細示例&#xff1a; 一、基本用法 1. 顯示當前日期和時間 <BASH> date # 輸出&#xff1a;Thu Jun 13 14:25:36 CST 20242. 設置系統時間&#xff08;需root權限&am…

Maven的依賴管理

maven相關依賴的官網&#xff1a;https://mvnrepository.com/ pom.xml是項目依賴的配置文件 maven首先會去本地倉庫下載相關依賴&#xff0c;如果沒有&#xff0c;則會去私服下載&#xff0c;再沒有&#xff0c;就去中央倉庫或鏡像下載。 自定義properties&#xff0c;可使用…

Mybaties批量操作

1、批量插入 <!--批量操作-插入--><!-- 相當于INSERT INTO t_goods (c1,c2,c3) VALUES (a1,a2,a3),(b1,b2,b3),(d1,d2,d3),...--><insert id"batchInsert" parameterType"java.util.List">INSERT INTO t_goods (title,sub_title,origina…

向量庫集成指南

文章目錄 向量庫集成指南Chroma集成Pinecone集成MiLvus集成向量庫集成指南 向量庫是一種索引和存儲向量嵌入以實現高效管理和快速檢索的數據庫。與單獨的向量索引不同,像Pinecone這樣的向量數據庫提供了額外的功能,例如,索引管理、數據管理、元數據存儲和過濾,以及水平擴展…

軟件測試之使用Requests庫進行接口測試

文章目錄 前言Requests庫是什么為什么要用Requests庫進行接口測試安裝Requests庫Requests庫使用發送GET請求發送帶查詢參數的GET請求響應內容格式添加請求頭信息發送一個POST請求查看響應內容斷言請求超時Cookie與Session模擬登錄 參考目錄 前言 閱讀本文前請注意最后編輯時間…

AttributeError: module ‘backend_interagg‘ has no attribute ‘FigureCanvas‘

AttributeError: module backend_interagg has no attribute FigureCanvas 這個錯誤通常是由于 Matplotlib 的后端配置問題引起的。具體來說&#xff0c;Matplotlib 在嘗試加載某個后端時&#xff0c;發現該后端模塊中缺少必要的屬性&#xff08;如 FigureCanvas&#xff09;&a…

iWebOffice2015 中間件如何在Chrome107及之后的高版本中加載

iWebOffice2015是江西金格科技有限公司開發的一款智能文檔中間件&#xff0c;和一些知名OA及ERP公司曾經達成OEM合作&#xff0c;所以用戶一度比較多&#xff0c;但不幸的是Chromium內核瀏覽器在2022年10月份發布的107版本中永久取消了對PPAPI插件的加載支持&#xff0c;導致使…