日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

leetcode刷题集:栈与队列

發布時間:2023/12/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 leetcode刷题集:栈与队列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

      • 01 用兩個棧模擬一個隊列
      • 02 包含min函數的棧
      • 03 棧的壓入、彈出序列
      • 隊列的最大值

01 用兩個棧模擬一個隊列

用兩個棧實現一個隊列。隊列的聲明如下,請實現它的兩個函數 appendTail 和 deleteHead ,分別完成在隊列尾部插入整數和在隊列頭部刪除整數的功能。(若隊列中沒有元素,deleteHead 操作返回 -1 )

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

解題思路:
棧是先進后出,隊列是先進先出
用兩個棧來模擬隊列的核心思想就是一個棧作為入棧,一個作為出棧,將入棧內的數據先倒出到出棧中,這樣一個反復就可以做到先進先出。

class CQueue {stack<int> stack_in;stack<int> stack_out; public:CQueue() {while(!stack_in.empty()){stack_in.pop(); //清空進棧}while(!stack_out.empty()){stack_out.pop();//清空入棧}}void appendTail(int value) {stack_in.push(value); //在進棧中直接插入元素} int deleteHead() {if(stack_out.empty()) //如果出棧是空,從進棧中加入元素{if(stack_in.empty()) //如果進棧也是空表明棧內沒有元素 返回-1{return -1;}while(!stack_in.empty()) //如果進棧不為空,將進棧中的元素都加入出棧中{stack_out.push(stack_in.top());stack_in.pop();}int out = stack_out.top();stack_out.pop();return out;}else{int out = stack_out.top();stack_out.pop();return out;}} };

02 包含min函數的棧

定義棧的數據結構,請在該類型中實現一個能夠得到棧的最小元素的 min 函數在該棧中,調用 min、push 及 pop 的時間復雜度都是 O(1)。
解題思路
方法一:建立兩個棧,一個棧負責正常的push,pop,另外一個棧負責存儲非嚴格遞減的輸入數據
當正常棧pop出的元素等于非非嚴格遞減棧的棧頂元素時,非嚴格遞減棧也pop棧頂元素

class MinStack { private:stack<int> stkNormal;stack<int> stkMin; public://方法一:建立兩個棧,一個棧負責正常的push,pop,另外一個棧負責存儲非嚴格遞減的輸入數據// 當正常棧pop出的元素等于非非嚴格遞減棧的棧頂元素時,非嚴格遞減棧也pop棧頂元素/** initialize your data structure here. */MinStack() {}//加入新元素的時候判斷是否是最小元素void push(int x) {if(stkMin.empty()){stkMin.push(x);stkNormal.push(x);}else{if(x <= stkMin.top()){stkMin.push(x);}stkNormal.push(x);}}// pop的時候看看是不是最小元素void pop() {if(stkNormal.top() == stkMin.top()){stkNormal.pop();stkMin.pop();}else{stkNormal.pop();}}int top() {return stkNormal.top();}int min() {return stkMin.top();} };/*** Your MinStack object will be instantiated and called as such:* MinStack* obj = new MinStack();* obj->push(x);* obj->pop();* int param_3 = obj->top();* int param_4 = obj->min();*/

03 棧的壓入、彈出序列


解題思路用一個棧來模擬進棧操作

class Solution { public:bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {if (popped.size() == 0){return true;}stack<int> pushStack;pushStack.push(pushed[0]);int j = 0;for (int i = 0; i < popped.size(); i++){while (pushStack.top() != popped[i]){j++;//超出邊界等于失敗if (j >= pushed.size()){return false;}pushStack.push(pushed[j]);}//棧為空表示失敗if (pushStack.empty()){return false;}pushStack.pop();//棧為空補充元素if (pushStack.empty() & (i < popped.size()-1)){j++;//超出邊界等于失敗if (j >= pushed.size()){return false;}pushStack.push(pushed[j]);}}return true;} };

隊列的最大值


解題思路 用空間換時間

class MaxQueue { private:queue<int> myQue;deque<int> recordMax; public:MaxQueue() {}int max_value() {if (recordMax.empty())return -1;return recordMax.front();}void push_back(int value) {myQue.push(value);while ((!recordMax.empty()) && (value > recordMax.back())){recordMax.pop_back();}recordMax.push_back(value);}int pop_front() {if (myQue.empty()) return -1;if (myQue.front() == recordMax.front()){recordMax.pop_front();}int temp = myQue.front();myQue.pop();return temp;} }; 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的leetcode刷题集:栈与队列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。