有關棧的題目

設計包含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;
}  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章