实现一个栈, 其 Push,Pop,Min 操作的 时间复杂度 均为 O( 1 )

1.实现一个栈, 要求 : Push, Pop, Min 操作的 时间复杂度 均为 O( 1 ).

思路: 首先, 我们先否定一种思路: 用一个变量保存每次入栈后 栈中最小值, 这种思路的问题在于, 第一次返回最小值是正确的, 可是这个最小值被 Pop 掉后, 次小值如何获得呢.接着 我想到了 ,用数组保存 每个元素, 每次元素入栈时进行比较 , 按降序 排序,  后来发现这种思路 既麻烦又没有必要

我们用一个 辅助栈 minS 来保存 最小值, 一共有两个栈 dataS 栈 和 minS 栈, minS 栈用来实现 Min( ) Fun 功能

我们给 一组数据 即可明白  假如入栈序列:

栈底  ->    1226 521 626 8 2 6 7 1 9   <- 栈顶   从 1226  --->   9  元素分别入栈 dataS  下面我们分析 dataS 的元素入栈情况:

我们进行分析:   首先   我们从开始 进行分析  开始入栈 1226 为最小元素  入 minS 栈,接着入栈 521 成为最小元素 ,入 minS 栈这时我们重点进行分析   626入栈 dataS后 此时最小元素 为 什么? 依然为521  假设现在 dataS 栈中只有 三个元素  1126 521 626  在元素 521 出栈前, Min函数 返回值为 521  也就是说 ,只要 521 后面入栈的元素 比 521 大, 根本不用担心 Min 函数返回值的事, 我们根本不用管 minS 栈的入栈问题, 直到有一个 入栈元素 比之前 的最小值 小 ,我们才将这个元素入 minS 栈,之后的思路, 和前面类似。   到了这里, 我们就明白, 根本不用 用 数组加排序来 实现 Min我们要做的是 用 另外一个栈 来实现我们的 Min( ) 功能.

代码:

#include <iostream>
#include <windows.h>
#include <stack>
using namespace std;


template <typename T>
class MyStack
{
public:
	void Push( const T& data )
	{
		dataS.push( data );

		if ( 1 == dataS.size( ) )				//第一次入栈
			minS.push( data );
		else
			if ( data <= minS.top( ) )
				minS.push( data );
	}

	void Pop( )
	{
		if ( minS.top( ) == dataS.top( ) )				//注意到我们这里的删除 条件 ,所以 , 入栈 minS 时的判断条件是 <= 而不是 <
		{	
			dataS.pop( );
			minS.pop( );
		}
		else
			dataS.pop( );
	}

	T& Min( )
	{
		return minS.top( );
	}

private:
	stack<T> dataS;
	stack<T> minS;
};


void TestMyStack( )
{
	MyStack<int> s;

	s.Push( 2 );
	cout << s.Min( ) << endl;

	s.Push( 3 );
	s.Push( 5 );
	cout << s.Min( ) << endl;

	s.Push( 1 );
	cout << s.Min( ) << endl;

	s.Push( 6 );
	s.Push( 3 );
	s.Push( 1 );
	cout << s.Min( ) << endl;

	//2351631 
	s.Pop( );
	cout << s.Min( ) << endl;

	s.Pop();
	s.Pop();
	s.Pop();

	//235
	cout << s.Min( ) << endl;
}

int main( )
{
	TestMyStack();

	system( "pause" );
	return 0;
}


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