C++的STL栈实现获取栈中最小元素的成员
生活随笔
收集整理的這篇文章主要介紹了
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栈实现获取栈中最小元素的成员的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中考语文作文结尾方式有好的推荐吗?
- 下一篇: f-free 查看系统中空闲和使用的内存