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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

stack经典题

發布時間:2025/3/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 stack经典题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.最小棧簡單跳轉LeetCode
2.壓入彈出序列中等跳轉牛客
3.逆波蘭式計算中等跳轉LeetCode
4.用棧實現隊列簡單跳轉LeetCode

LeetCode 155:最小棧

這道題關鍵點在于要在常數時間內檢索到一個棧中的最小元素,所以我們可以額外實現一個棧,這個棧的棧頂始終保存的是原棧的最小的元素,在插入和刪除時都要進行判斷

class MinStack { public:/** initialize your data structure here. */MinStack()//如果不寫C++也會自動調用stack的默認構造函數{}void push(int val) {_elements.push(val);if(_min.empty() || val<=_min.top())//如果插入的元素要比最小棧的棧頂元素還要小,那么入棧_min.push(val);}void pop() {if(_min.top()==_elements.top())//最小棧保存的是元素棧中最小的元素,所以如果它被溢出了,那么最小棧也相應要被移除_min.pop();_elements.pop();}int top() {return _elements.top();}int getMin() {return _min.top();} private:stack<int> _elements;stack<int> _min; };/*** Your MinStack object will be instantiated and called as such:* MinStack* obj = new MinStack();* obj->push(val);* obj->pop();* int param_3 = obj->top();* int param_4 = obj->getMin();*/

LeetCode 156:壓入彈出序列

這道題比較經典,可以使用棧來模擬這個過程。如下,用pushi掃描pushv,用pushj掃描popv,如果s為空或s的棧頂元素和popv[popj]不相等,說明此時的進棧序列的這個元素不是立馬出棧的,因此讓其入棧,知道某一個s.top==popv[popj]時,就表明此時可以出棧了,一次類推。
如果最后popj走到了popv的末尾那肯定是滿足的情況

class Solution { public:bool IsPopOrder(vector<int> pushV,vector<int> popV) {if(pushV.size()!=popV.size()){return false;//長度不一致}stack<int> s;//用s這個棧進行模擬出棧size_t pushi=0;//用pushi去掃描pushVsize_t popj=0;//用popi去掃描popVwhile(popj<popV.size())//一旦不在while循環內return,那么肯定是滿足情況的{while(s.empty() || s.top()!=popV[popj])//1:空是因為開始的時候棧是空的。2:如果s的棧頂元素不等于出棧序列的對應元素,表明,此時的棧頂元素不是立即出棧的,所以先入棧,待以后出棧{if(pushi>pushV.size())//這種情況就是不滿足了,因為pushi已經跑到最后了return false;else{s.push(pushV[pushi]);//進棧pushi++;}}s.pop();//如果棧頂元素和出棧序列的棧頂元素相等,表明此時出棧序列的該元素應該要出棧了popj++; }return true;} };

LeetCode 150:逆波蘭表達式求值

這個問題也是棧的經典問題,我在這篇文章專門講到了這個專題

使用棧解決的一類經典問題:表達式轉換及求值

LeetCode 232:用棧實現隊列

用兩個棧實現隊列,s1用來入,s2用來接口操作,入“隊列時”直接入s1,pop時如果s2不空那么就先出s2的,因為此時s2里面的是以前的元素,如果s2空了,那么就把s1的元素依次出棧然后入s2,然后再出棧
具體過程可以看這篇博客

數據結構-線性表之用隊列實現棧&&用棧實現隊列

class MyQueue { public:/** Initialize your data structure here. */MyQueue() {}/** Push element x to the back of queue. */void push(int x) {s1.push(x);}/** Removes the element from in front of queue and returns that element. */int pop() {if(!s2.empty())//如果s2不空,那么先出s2{int temp=0;temp=s2.top();s2.pop();return temp;}while(!s1.empty())//如果s2空了,那么把s1的依次出棧,入棧到s2{int temp=s1.top();s2.push(temp);s1.pop();}int temp=0;temp=s2.top();s2.pop();return temp;}/** Get the front element. */int peek() {if(!s2.empty()){return s2.top();}while(!s1.empty()){int temp=s1.top();s2.push(temp);s1.pop();}return s2.top();}/** Returns whether the queue is empty. */bool empty() {return s1.empty() && s2.empty();}public:stack<int> s1;stack<int> s2; };

總結

以上是生活随笔為你收集整理的stack经典题的全部內容,希望文章能夠幫你解決所遇到的問題。

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