設計包含min函數的棧。
定義棧的數據結構,要求添加一個min函數,能夠得到棧的最小元素。
要求函數min、push以及pop的時間複雜度都是O(1)。
結合鏈表一起做。容器vector代替鏈表
eg: 10,3,3,8,2,6
1.push() :如果push入棧A的元素小於棧B的棧頂所對應的的元素,則將該元素push入棧B中; 或者第一個元素也直接push入B中
棧A 輔助棧B( 存放最小值 )
6 2 min=2
2 2 min=2
8 3 min=3
3 3 min=3
3 3 min=3
10 10 min=10
2.pop() :棧A刪去一個,棧B也刪去一個
棧A 輔助棧B
6 min=2
2 min=2
8 2 min=3
3 3 min=3 //注意最小值相等的情況
3 3 min=3
10 10 min=10
3.min() :直接返回棧B中的最後一個元素
代碼:
#include <iostream>
#include <vector>
#include <assert.h>
using namespace std;
template<typename T>
class CStack //主要包含了min()功能,且時間複雜度爲O(1)
{
vector<T> m_data; //用容器來模擬棧
vector<size_t> m_supply; //輔助棧
public:
void Push(T data)
{
if(m_data.empty() || data <= m_data.back() )
m_supply.push_back(data);
m_data.push_back(data);
}
void Pop()
{
assert(!m_data.empty() && !m_supply.empty());
if(m_data.back() == m_supply.back())
m_supply.pop_back();
m_data.pop_back();
}
T min()
{
return m_supply.back();
}
};
int main()
{
CStack<int> stackObj;
stackObj.Push(10);
stackObj.Push(3);
stackObj.Push(3);
stackObj.Push(8);
stackObj.Push(2);
stackObj.Push(6);
cout<<stackObj.min()<<endl;
stackObj.Pop();
stackObj.Pop();
cout<<stackObj.min()<<endl;
return 0;
}