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

来源:互联网 发布:贵州广电网络公司地址 编辑:程序博客网 时间:2024/05/16 10:09

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 );elseif ( data <= minS.top( ) )minS.push( data );}void Pop( ){if ( minS.top( ) == dataS.top( ) )//注意到我们这里的删除 条件 ,所以 , 入栈 minS 时的判断条件是 <= 而不是 <{dataS.pop( );minS.pop( );}elsedataS.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();//235cout << s.Min( ) << endl;}int main( ){TestMyStack();system( "pause" );return 0;}


1 0