重拾C++之菜鳥刷算法第6篇---棧與隊列

棧與隊列

一、用棧實現隊列

題目

請你僅使用兩個棧實現先入先出隊列。隊列應當支持一般隊列支持的所有操作(pushpoppeekempty):

實現 MyQueue 類:

  • void push(int x) 將元素 x 推到隊列的末尾
  • int pop() 從隊列的開頭移除并返回元素
  • int peek() 返回隊列開頭的元素
  • boolean empty() 如果隊列為空,返回 true ;否則,返回 false

說明:

  • 只能 使用標準的棧操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
  • 你所使用的語言也許不支持棧。你可以使用 list 或者 deque(雙端隊列)來模擬一個棧,只要是標準的棧操作即可。

232. 用棧實現隊列 - 力扣(LeetCode)

題解

class MyQueue {
public:stack<int> inPut;stack<int> outPut;MyQueue() {}void push(int x) {inPut.push(x);}int pop() {if(outPut.empty()){while(!inPut.empty()){int tmp = inPut.top();outPut.push(tmp);inPut.pop();}}int result = outPut.top();outPut.pop();return result;}int peek() {int tmp = this->pop();outPut.push(tmp);return tmp;}bool empty() {if(inPut.empty() && outPut.empty()){return true;}else{return false;}}
};

二、用隊列實現棧

題目

請你僅使用兩個隊列實現一個后入先出(LIFO)的棧,并支持普通棧的全部四種操作(pushtoppopempty)。

實現 MyStack 類:

  • void push(int x) 將元素 x 壓入棧頂。
  • int pop() 移除并返回棧頂元素。
  • int top() 返回棧頂元素。
  • boolean empty() 如果棧是空的,返回 true ;否則,返回 false

225. 用隊列實現棧 - 力扣(LeetCode)

題解

class MyStack {
public:queue<int> numOut;queue<int> copyOut;MyStack() {}void push(int x) {numOut.push(x);}int pop() {int count = numOut.size();// 計算主的隊列長度,注意留下最后一個元素while(--count){copyOut.push(numOut.front());numOut.pop();}// push出最后一個元素int result = numOut.front();numOut.pop();// 將備份的數據拿出來numOut = copyOut;// 清空備份區while(!copyOut.empty()){copyOut.pop();}return result;}int top() {return numOut.back();}bool empty() {return numOut.empty();}
};

三、有效的括號

題目

給定一個只包括 '('')''{''}''['']' 的字符串 s ,判斷字符串是否有效。

有效字符串需滿足:

  1. 左括號必須用相同類型的右括號閉合。
  2. 左括號必須以正確的順序閉合。
  3. 每個右括號都有一個對應的相同類型的左括號。

20. 有效的括號 - 力扣(LeetCode)

題解

class Solution {
public:bool isValid(string s) {stack<char> stk;for(int i = 0; i < s.size(); i++){if(s[i] == '('){stk.push(')');}else if(s[i] == '{'){stk.push('}');}else if(s[i] == '['){stk.push(']');}else if(s[i] == ')'){if(!stk.empty() && stk.top() == s[i]){stk.pop();}else return false;}else if(s[i] == ']'){if(!stk.empty() && stk.top() == s[i]){stk.pop();}else return false;}else if(s[i] == '}'){if(!stk.empty() && stk.top() == s[i]){stk.pop();}else return false;}}if(stk.empty()){return true;}else return false;}
};

簡化版本

class Solution {
public:bool isValid(string s) {if(s.size() % 2 != 0) return false;stack<char> stk;for(int i = 0; i < s.size(); i++){if(s[i] == '('){stk.push(')');}else if(s[i] == '{'){stk.push('}');}else if(s[i] == '['){stk.push(']');}else if(!stk.empty() && stk.top() == s[i]){stk.pop();}else return false;}return stk.empty();}
};

四、刪除字符串中的所有相鄰重復項

題目

給出由小寫字母組成的字符串 S重復項刪除操作會選擇兩個相鄰且相同的字母,并刪除它們。

在 S 上反復執行重復項刪除操作,直到無法繼續刪除。

在完成所有重復項刪除操作后返回最終的字符串。答案保證唯一。

1047. 刪除字符串中的所有相鄰重復項 - 力扣(LeetCode)

題解

class Solution {
public:string removeDuplicates(string s) {stack<char> result;for (int i = 0; i < s.size(); i++) {if (!result.empty() && s[i] == result.top()) {result.pop();}else{result.push(s[i]);}}string final;int length = result.size();for (int i = 0; i < length; i++) {final += result.top();result.pop();}for (int i = 0, j = final.size() - 1; i < j; i++, j--) {swap(final[i], final[j]);}return final;}
};

五、逆波蘭表達式求值

知識點

  • stoll 將字符串轉換為 long long int
  • 后綴表達式:遇到數字則入棧,遇到運算符則去除棧頂兩個數字進行運算,并將結果壓入棧中

題目

給你一個字符串數組 tokens ,表示一個根據 逆波蘭表示法 表示的算術表達式。

請你計算該表達式。返回一個表示表達式值的整數。

注意:

  • 有效的算符為 '+''-''*''/'
  • 每個操作數(運算對象)都可以是一個整數或者另一個表達式。
  • 兩個整數之間的除法總是 向零截斷
  • 表達式中不含除零運算。
  • 輸入是一個根據逆波蘭表示法表示的算術表達式。
  • 答案及所有中間計算結果可以用 32 位 整數表示。

150. 逆波蘭表達式求值 - 力扣(LeetCode)

題解

class Solution {
public:int evalRPN(vector<string>& tokens) {// 力扣修改了后臺測試數據,需要用longlongstack<long long> st; for (int i = 0; i < tokens.size(); i++) {if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") {long long num1 = st.top();st.pop();long long num2 = st.top();st.pop();if (tokens[i] == "+") st.push(num2 + num1);if (tokens[i] == "-") st.push(num2 - num1);if (tokens[i] == "*") st.push(num2 * num1);if (tokens[i] == "/") st.push(num2 / num1);} else {st.push(stoll(tokens[i]));}}int result = st.top();st.pop(); // 把棧里最后一個元素彈出(其實不彈出也沒事)return result;}
};

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

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

相關文章

【Hadoop】使用Metorikku框架讀取hive數據統計分析寫入mysql

一、定義作業文件 作業文件 該文件將包括輸入源、輸出目標和要執行的配置文件的位置&#xff0c;具體內容如下 metrics:- /user/xrx/qdb.yaml # 此位置為hdfs文件系統目錄 inputs: output:jdbc:connectionUrl: "jdbc:mysql://233.233.233.233:3306/sjjc"user: &quo…

虛擬帆船:利用技術出海的探險家

在數字化的浪潮中&#xff0c;一個新時代的探險家誕生了。他們不是在尋找未知大陸的勇士&#xff0c;而是在尋求跨界電商和全球游戲市場的先鋒。這些現代探險家的帆船是由SOCKS5代理和代理IP構成的&#xff0c;他們的海圖則是由數據和市場分析繪制的。 出海的第一步&#xff1a…

WebServer -- 注冊登錄

目錄 &#x1f349;整體內容 &#x1f33c;流程圖 &#x1f382;載入數據庫表 提取用戶名和密碼 &#x1f6a9;同步線程登錄注冊 補充解釋 代碼 &#x1f618;頁面跳轉 補充解釋 代碼 &#x1f349;整體內容 概述 TinyWebServer 中&#xff0c;使用數據庫連接池實現…

Linux 內核irq_stack遍歷

環境Centos 4.18.0-80.el8.x86_64 一、x86架構堆棧類型說明 https://www.kernel.org/doc/Documentation/x86/kernel-stacks int get_stack_info(unsigned long *stack, struct task_struct *task,struct stack_info *info, unsigned long *visit_mask) {if (!stack)goto unk…

【深度學習筆記】計算機視覺——圖像增廣

圖像增廣 sec_alexnet提到過大型數據集是成功應用深度神經網絡的先決條件。 圖像增廣在對訓練圖像進行一系列的隨機變化之后&#xff0c;生成相似但不同的訓練樣本&#xff0c;從而擴大了訓練集的規模。 此外&#xff0c;應用圖像增廣的原因是&#xff0c;隨機改變訓練樣本可以…

Python + Selenium —— 下拉菜單處理!

傳統的下拉菜單 Select 元素&#xff0c;由一個 Select 一系列的 option 元素構成。 <select id"source" name"source"><option value"">--請選擇--</option><option value"1001">網絡營銷</option>&…

3.3 序列式容器-deque、stack、queue、heap、priority_queue

deque 3.1定義 std::deque&#xff08;雙端隊列&#xff09;是C標準模板庫&#xff08;STL&#xff09;中的一種容器&#xff0c;表示雙端隊列數據結構。它提供了在兩端高效地進行插入和刪除操作的能力。與vector的連續線性空間類似&#xff0c;但有所不同&#xff0c;deque動…

基于ssm旅社客房收費管理系統+vue

目 錄 目 錄 I 摘 要 III ABSTRACT IV 1 緒論 1 1.1 課題背景 1 1.2 研究現狀 1 1.3 研究內容 2 2 系統開發環境 3 2.1 vue技術 3 2.2 JAVA技術 3 2.3 MYSQL數據庫 3 2.4 B/S結構 4 2.5 SSM框架技術 4 3 系統分析 5 3.1 可行性分析 5 3.1.1 技術可行性 5 3.1.2 操作可行性 5 3…

STM32使用FlyMcu串口下載程序與STLink Utility下載程序

文章目錄 前言軟件鏈接一、FlyMcu串口下載程序原理優化手動修改跳線帽選項字節其他功能 二、STLink Utility下載程序下載程序選項字節固件更新 前言 本文主要講解使用FlyMcu配合USART串口為STM32下載程序、使用STLink Utility配合STLink為STM32下載程序&#xff0c;以及這兩個…

代碼隨想錄算法訓練營第62/63天| 503.下一個更大元素II、42. 接雨水、84.柱狀圖中最大的矩形

文章目錄 503.下一個更大元素II思路代碼 42. 接雨水思路代碼 84.柱狀圖中最大的矩形思路代碼 503.下一個更大元素II 題目鏈接&#xff1a;503.下一個更大元素II 文章講解&#xff1a;代碼隨想錄|503.下一個更大元素II 思路 和739. 每日溫度 (opens new window)也幾乎如出一轍&…

C++/數據結構:AVL樹

目錄 一、AVL樹的概念 二、AVL樹的實現 2.1節點定義 2.2節點插入 三、AVL樹的旋轉 3.1新節點插入較高左子樹的左側&#xff1a;右單旋 3.2新節點插入較高右子樹的右側&#xff1a;左單旋 3.3新節點插入較高左子樹的右側---左右&#xff1a;先左單旋再右單旋 3.4新節點插…

Rocky Linux 運維工具 Systemd

一、Systemd 的簡介 Systemd是一個用于管理Linux系統啟動進程和服務的系統和服務管理器&#xff0c;取代了傳統的init系統。它提供了并行啟動、依賴關系管理、動態加載服務文件等功能&#xff0c;成為現代Linux發行版中主流的初始化系統。 二、Systemd 的參數說明 [Unit] Des…

SLAM基礎知識-卡爾曼濾波

前言&#xff1a; 在SLAM系統中&#xff0c;后端優化部分有兩大流派。一派是基于馬爾科夫性假設的濾波器方法&#xff0c;認為當前時刻的狀態只與上一時刻的狀態有關。另一派是非線性優化方法&#xff0c;認為當前時刻狀態應該結合之前所有時刻的狀態一起考慮。 卡爾曼濾波是…

SD NAND:為車載顯示器注入智能與安全的心臟

SD NAND 在車載顯示器的應用 在車載顯示器上&#xff0c;SD NAND&#xff08;Secure Digital NAND&#xff09;可以有多種應用&#xff0c;其中一些可能包括&#xff1a; 導航數據存儲&#xff1a; SD NAND 可以用于存儲地圖數據、導航軟件以及車載系統的相關信息。這有助于提…

微服務day03-Nacos配置管理與Nacos集群搭建

一.Nacos配置管理 Nacos不僅可以作為注冊中心&#xff0c;可以進行配置管理 1.1 統一配置管理 統一配置管理可以實現配置的熱更新&#xff08;即不用重啟當服務發生變更時也可以直接更新&#xff09; dataId格式&#xff1a;服務名-環境名.yaml&#xff0c;分組一般使用默認…

InnoDB高級特性篇(5)-使用InnoDB的全文索引

InnoDB是MySQL數據庫的一個關系型存儲引擎。它提供了很多強大的功能&#xff0c;其中一個重要的功能是全文索引。全文索引允許我們在文本數據中進行高效的搜索&#xff0c;以找到包含特定關鍵詞的記錄。在本文中&#xff0c;我們將詳細介紹如何在InnoDB中使用全文索引。 首先&…

藍橋杯備戰刷題two(自用)

1.楊輝三角形 #include<iostream> using namespace std; #define ll long long const int N2e510; int a[N]; //1 0 0 0 0 0 0 //1 1 0 0 0 0 0 //1 2 1 0 0 0 0 //1 3 3 1 0 0 0 //1 4 6 4 1 0 0 //1 5 10 10 5 1 //前綴和思想 //第一列全為1,第二列為從0開始遞增1的序…

信息檢索(七):Transformer Memory as a Differentiable Search Index

Transformer Memory as a Differentiable Search Index 摘要1. 引言2. 相關工作3. 可微搜索索引3.1 索引策略3.1.1 索引方法3.1.2 文檔表示策略 3.2 用于檢索的 Docids 表示3.3 訓練和優化 4. 實驗4.1 基線4.2 實驗結果 5. 結論參考資料 原文鏈接&#xff1a;https://proceedin…

Revit-二開之創建線性尺寸標注-(5)

創建線性尺寸標注 對應的Revit界面的按鈕 線性尺寸標注源碼 本篇文章實現的邏輯是從rvt文章中拾取一面墻,然后對墻添加再水平方向上的線性尺寸標注 protected override Result OnExecute(ExternalCommandData commandData, ref string message, ElementSet elements

LeetCode 刷題 [C++] 第55題.跳躍游戲

題目描述 給你一個非負整數數組 nums &#xff0c;你最初位于數組的 第一個下標 。數組中的每個元素代表你在該位置可以跳躍的最大長度。 判斷你是否能夠到達最后一個下標&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 題目分析 題目中…