LeetCode每日一題【c++版】- 用隊列實現棧與用棧實現隊列

用隊列實現棧

題目描述

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

實現?MyStack?類:

  • void push(int x)?將元素 x 壓入棧頂。
  • int pop()?移除并返回棧頂元素。
  • int top()?返回棧頂元素。
  • boolean empty()?如果棧是空的,返回?true?;否則,返回?false?。
輸入:
["MyStack", "push", "push", "top", "pop", "empty"]
[[], [1], [2], [], [], []]
輸出:
[null, null, null, 2, 2, false]
解釋:
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False

解題思路

棧是一種后進先出的數據結構,元素從頂端入棧,然后從頂端出棧。

隊列是一種先進先出的數據結構,元素從后端入隊,然后從前端出隊。

????????為了滿足棧的特性,即最后入棧的元素最先出棧,在使用隊列實現棧時,應滿足隊列前端的元素是最后入棧的元素。可以使用兩個隊列實現棧的操作,其中queue1用于存儲棧內的元素,queue2作為入棧操作的輔助隊列。

????????入棧操作時,首先將元素入隊到 queue2,然后將 queue1的全部元素依次出隊并入隊到 queue2,此時 queue2的前端的元素即為新入棧的元素,再將 queue1和 queue2互換,則 queue1的元素即為棧內的元素,queue1的前端和后端分別對應棧頂和棧底。

????????由于每次入棧操作都確保 queue1的前端元素為棧頂元素,因此出棧操作和獲得棧頂元素操作都可以簡單實現。出棧操作只需要移除 queue1的前端元素并返回即可,獲得棧頂元素操作只需要獲得 queue1的前端元素并返回即可(不移除元素)。

????????由于 queue1用于存儲棧內的元素,判斷棧是否為空時,只需要判斷 queue1是否為空即可。?

復雜度分析

時間復雜度:入棧操作O(n),其余操作都是O(1),n是棧內的元素個數

空間復雜度:O(n),需要使用兩個隊列存儲站內的元素

代碼

#include <queue>
#include <array>
#include <iostream>
using namespace std;
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(){int r = queue1.front();return r;}/** 返回棧是否為空. */bool empty(){return queue1.empty();}
};
int main()
{MyStack myStack;myStack.push(1);myStack.push(2);cout << myStack.top() << endl;  // 返回 2cout << myStack.pop() << endl;;   // 返回 2cout << myStack.empty() << endl; // 返回 False
}

用棧實現隊列

題目描述

鏈接:簡單232.用棧實現隊列

????????請你僅使用兩個棧實現先入先出隊列。隊列應當支持一般隊列支持的所有操作(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(雙端隊列)來模擬一個棧,只要是標準的棧操作即可。

解題思路

????????將一個棧當作輸入棧,用于壓入 push傳入的數據;另一個棧當作輸出棧,用于 pop和 peek操作。每次 pop或 peek時,若輸出棧為空則將輸入棧的全部數據依次彈出并壓入輸出棧,這樣輸出棧從棧頂往棧底的順序就是隊列從隊首往隊尾的順序。

復雜度分析

時間復雜度:push和 emptyO(1),pop和 peek為均攤 O(1)。對于每個元素,至多入棧和出棧各兩次,故均攤復雜度為 O(1)。

空間復雜度:O(n)。其中 n是操作總數。對于有 n次 push操作的情況,隊列中會有 n個元素,故空間復雜度為 O(n)。

代碼

#include <stack>
#include <iostream>
using namespace std;
class MyQueue
{
public:MyQueue(){}void push(int x){// 1.把s1所有元素彈出后依次放入s2while (!s1.empty()){s2.push(s1.top());s1.pop();}// 2.新元素加入到s2頂部s2.push(x);// 3.把s2所有元素彈出后依次放入s1while (!s2.empty()){s1.push(s2.top());s2.pop();}}int pop(){int ret = s1.top();s1.pop();return ret;}int peek(){return s1.top();}bool empty(){return s1.empty();}private:stack<int> s1;stack<int> s2;
};
int main()
{MyQueue myQueue;myQueue.push(1); // queue is: [1]myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)cout << myQueue.peek() << endl; // return 1cout << myQueue.pop() << endl; // return 1, queue is [2]cout << myQueue.empty() <<endl; // return false
}

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

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

相關文章

Studio One 6永久激活版 附完整圖文安裝破解教程

Studio One 6是一款功能強大的音樂制作和錄音軟件&#xff0c;專為Mac操作系統設計。它提供了多軌錄音和混音、MIDI音樂制作、實時效果和處理、VST插件支持以及高級編輯和編排等豐富的功能。無論是專業音樂制作人還是音樂愛好者&#xff0c;都可以使用Studio One 6來創建和編輯…

程序員英語詞匯寶典(建議收藏)

很多小伙伴說&#xff0c;英文不好能不能學習編程&#xff0c;我個人的看法是英文不好&#xff0c;并不影響你學習編程&#xff0c;但有可能會影響到你的編程上限&#xff0c;因為一些最新的文檔都是英文的。如果你想成為一個編程大牛&#xff0c;那么英文還是很有必要的。今天…

cocos-lua定時器用法

本文介紹cocos-lua(非Quick-cocos)的定時器用法 定時器按是否會隨節點銷毀&#xff0c;可分為節點調度器和全局調度器 一.節點調度器 frameworks\cocos2d-x\cocos\scripting\lua-bindings\script\cocos2d\deprecated.lua中實現了了schedule和 performWithDelay 1.1.schedul…

基礎真空技術外國文獻Fundamentals of Vacuum Technology

基礎真空技術外國文獻Fundamentals of Vacuum Technology

道路積水監測站——確保道路暢通和行車安全

TH-JS1道路積水監測站是一種專門用于監測城市道路積水情況的設備&#xff0c;旨在保障城市道路安全和防止水患對交通造成的不利影響。這些監測站通過實時檢測和記錄道路積水數據&#xff0c;為城市管理部門提供重要信息&#xff0c;以便及時采取應對措施&#xff0c;確保道路暢…

vue diff算法介紹

Vue.js 的 diff 算法是一種用于虛擬 DOM 比較的高效算法&#xff0c;其核心目的是在數據變更時&#xff0c;能夠最小化 DOM 操作&#xff0c;提高更新性能。以下是關于 Vue diff 算法的介紹&#xff1a; 1. 算法目標&#xff1a; Vue 的 diff 算法旨在比較新舊虛擬節點&#…

990-29產品經理:IT risk management process IT風險管理流程

IT risk management process IT風險管理流程 In business, IT risk management entails a process of identifying, monitoring and managing potential information security or technology risks with the goal of mitigating or minimising their negative impact. Exampl…

MATLAB環境下基于離散小波變換的心電信號偽影去除及PQRST波檢測

可穿戴個人健康監護系統被廣泛認為是下一代健康監護技術的核心解決方案。監護設備不斷地感知、獲取、分析和存儲大量人體在日常活動中的生理數據&#xff0c;為人體的健康狀況提供必要的、準確的、集成的和長期的評估和反饋。在心電監測領域&#xff0c;可穿戴傳感器具有以下應…

LeetCode刷題-206.反轉鏈表【遞歸實現】

206.反轉鏈表 題目 給你單鏈表的頭節點 head &#xff0c;請你反轉鏈表&#xff0c;并返回反轉后的鏈表。 示例 示例1 輸入&#xff1a;head [1,2,3,4,5] 輸出&#xff1a;[5,4,3,2,1]示例2 輸入&#xff1a;head [1,2] 輸出&#xff1a;[2,1]示例3 輸入&#xff1a;hea…

鴻蒙開發就業前景以及發展方向分析~

鴻蒙操作系統作為華為公司自主研發的操作系統&#xff0c;已經成為當下炙手可熱的話題。作為一個全新的操作系統&#xff0c;鴻蒙開發為IT行業帶來了巨大的就業機會。本文將圍繞鴻蒙開發的就業前景以及發展方向展開討論。 一、鴻蒙開發就業前景 隨著鴻蒙操作系統的發布&#…

python實現有限域GF(2^8)上的乘法運算

有限域GF(2^8)上的乘法運算可以看成多項式的乘法 5e轉換成二進制為0101 1110&#xff0c;對應的多項式為x^6x^4x^3x^2x 3f轉換成二進制為0011 1111&#xff0c;對應的多項式為x^5x^4x^3x^2x1 將這兩個多項式相乘再模多項式x^8x^4x^3x1得到結果為1110 0101&#xff0c;轉換為…

latex編譯生成的pdf文件,圖片出現淺色的線

目錄 問題描述&#xff1a; 解決辦法&#xff1a; 問題描述&#xff1a; 在overleaf中&#xff0c;導入圖片&#xff0c;編譯之后&#xff0c;不知道為什么會出現一條淺色的線&#xff0c;很影響視覺效果&#xff08;ps:在瀏覽器中看不到這條線&#xff0c;但是在pdf閱讀器中…

分巧克力 刷題筆記

/* 分巧克力 解題思路 二分 直接檢查看答案是否符合題目條件 對于一塊邊長分別為x 和y的巧克力\\ 假設我們輸入檢查的數為k 其能分割成的 k*k 的巧克力的塊數為 (x/k)*(y/k) 因為c里面的除法是下取整的所以我們不用考慮奇偶數 是否能整除 將每一塊巧克力能分成的k*k的巧克力…

管家婆訂貨易在線商城 VshopProcess 任意文件上傳漏洞復現

0x01 產品簡介 管家婆訂貨易,幫助傳統企業構建專屬的訂貨平臺,PC+微信+APP+小程序+h5商城5網合一,無縫對接線下的管家婆ERP系統,讓用戶訂貨更高效。支持業務員代客下單,支持多級推客分銷,以客帶客,拓展渠道。讓企業的生意更輕松。 0x02 漏洞概述 管家婆訂貨易在線商城…

Matlab 機器人工具箱 符合動力學

文章目錄 1 符合化表示1.1 標準DH動力學1.2 改進DH動力學 質量集中在質心1.2 改進DH動力學 質量集中在末端1.3 程序問題1.3.1 Unable to perform assignment because value of type sym is not convertible to double.1.3.2 CAT arguments dimensions not consistent.參考鏈接1…

一篇了解電阻的使用

目錄 一、電阻理論基礎 1.電阻的定義 2.歐姆定律 3.電阻決定式 4.電阻的串并聯?編輯 5.電阻的功率 6.溫度對電阻的影響 二、電阻的選型 1.安裝方式 2.電阻值 &#xff08;1&#xff09;電阻值的標稱 &#xff08;2&#xff09;電阻值的確定 &#xff08;3&#x…

test only

https://drive.google.com/viewer?urlhttps://www.labnol.org/files/word.docx 使用插件將html -> pdf 要在React中使用react-pdf將一段HTML代碼轉換為PDF&#xff0c;您可以按照以下步驟進行操作&#xff1a; 1. 安裝react-pdf&#xff1a;在您的React項目中&#xff0…

[python] 構建數據流水線(pipeline)

Plum 是一個用于構建數據流水線&#xff08;pipeline&#xff09;的 Python 庫&#xff0c;它旨在簡化和優化數據處理流程&#xff0c;使得數據流轉和處理變得更加清晰、高效和可維護。下面我將更詳細地介紹 Plum 的特點、功能和使用方法。 Plum 的主要特點和功能&#xff1a;…

利用Vue3的新API(customRef)實現防抖效果

customRef是創建一個自定義的 ref&#xff0c;然后顯式聲明對其依賴追蹤和更新觸發的控制方式。因為ref是直接更新的&#xff0c;數據修改會馬上更新&#xff0c;而customRef可以認為控制更新的過程&#xff0c;比如可以利用這個api控制 空格輸入限制、數據更新速度控制、違規內…

小語言模型(SLM)介紹

大型語言模型&#xff08;LLM&#xff09;&#xff0c;如GPT、Claude等的出現&#xff0c;證明了它們是人工智能領域的一項變革性步伐&#xff0c;徹底革新了機器學習模型的強大性質&#xff0c;并在改變AI生態系統中發揮了重要作用&#xff0c;促使生態系統中的每個成員都必須…