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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

C++的STL栈实现获取栈中最小元素的成员

發布時間:2023/11/27 生活经验 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++的STL栈实现获取栈中最小元素的成员 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

實現一個獲取棧中最小數據成員的函數,該棧支持如下操作:
1.push(x) : 將元素x壓入棧中
2.pop() : 彈出(移除)棧頂元素
3.top() : 返回棧頂元素
4.getMin() : 返回棧內最小元素
要求時間復雜度為O(1)

這里關鍵是如何獲取最小值,棧中的元素不斷增加,且要達到O(1)常數級的時間復雜度,即創建好的棧進行排序,返回最小值是不可行的。

這里只有在創建過程中將棧中的最小值獲取到,此時一個可行的辦法為:
維護一個最小棧,保持棧頂元素為所有元素的最小值,且大小與原本數據棧保持一致。
這樣即使有原本數據的刪除添加,最小棧同樣跟隨數據刪除添加即可。

方法一(一個棧):
數據結構實現如下:

void push(int x) {data_stack.push(x);/*當最小棧中的元素不為空的時候,和棧頂元素進行大小比較,判斷是否要入棧*/if (!min_stack.empty()) {if (min_stack.top() > x) {min_stack.push(x);}else {min_stack.push(min_stack.top());}}/*為空的時候即可入棧*/else {min_stack.push(x);}
}
/*此時最小棧的棧頂即為數據棧中的最小元素*/
int get_min(){return min_stack.top();
}

方法二(兩個棧):

class MinStack {stack<int> S;int min=2147483647;
public:/** initialize your data structure here. */MinStack() {}//push操作void push(int x) {if (x <= min) { //當遇到小于等于最小值的數值,將上一個最小值也push到棧中S.push(min);min = x;}S.push(x);}void pop() {if (S.top() == min) { //pop的時候發現pop的時最小值,那么pop兩次,同時變更最小值S.pop();min = S.top();S.pop();} else {S.pop();}}int top() {return S.top();}int getMin() {return min;}
};

測試代碼實現如下:

#include <stack>
#include <iostream>
#include <algorithm>using namespace std;class My_stack{private:stack<int> data_stack,min_stack;public:void push(int x) {data_stack.push(x);if (!min_stack.empty()) {if (min_stack.top() > x) {min_stack.push(x);}else {min_stack.push(min_stack.top());}}else {min_stack.push(x);}}void pop() {min_stack.pop();data_stack.pop();}int top() {return data_stack.top();}int get_min(){return min_stack.top();}
};int main(){My_stack s;int tmp;cout << "construct the stack " << endl;while(cin >> tmp) {s.push(tmp);}cout << "min is " << s.get_min() << endl;s.pop();cout << "after pop " << s.top() << endl;s.push(-4);cout << "after push ,the top and min is " << s.top() << " " << s.get_min() << endl;return 0;
}

輸出如下:

construct the stack 
2 -1 -3 2 0 4
d
min is -3
after pop 0
after push -4,the top and min is -4 -4

總結

以上是生活随笔為你收集整理的C++的STL栈实现获取栈中最小元素的成员的全部內容,希望文章能夠幫你解決所遇到的問題。

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