实现一个栈, 其 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
- 实现一个栈, 其 Push,Pop,Min 操作的 时间复杂度 均为 O( 1 )
- 实现一个栈,要求push,pop,Min的操作时间复杂度为O(1)
- 实现一个栈Stack,要求实现Push、Pop、Min(返回最小值的操作)的时间复杂度为O(1)
- 实现一个栈Stack,Push、Pop、Min(返回最小值的操作)的时间复杂度为O(1)
- 实现pop push min操作时间复杂度为O(1)的栈结构
- 实现一个栈,要求Push/Pop/Min(返回最小值)的时间复杂度为O(1)
- 实现一个栈的pop,push,Min(最小值),时间复杂度为O(1)
- 实现一个栈,push、pop、求栈中最小值min的时间复杂度为O(1)
- 实现一个栈,要求pop,push,Min,时间复杂度为O(1)
- 设计一个栈结构,满足一下条件:min,push,pop操作的时间复杂度为O(1)
- 设计一个栈结构,满足一下条件:min,push,pop操作的时间复杂度为O(1)。
- 设计一个栈结构,满足一下条件:min,push,pop操作的时间复杂度为O(1)
- 满足min.push.pop操作时间复杂度为o(1)的栈
- 【栈队列】实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
- 栈--实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
- 【数据结构】实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
- 实现一个栈,要求实现Push(入栈)、Pop(出栈)、Min(返回最小值的操作)的时间复杂度为O(1)
- ~实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)~
- beta分布的采样或抽样(java程序)
- mysql 安装完成后 无法登录 提示密码相关错误
- 【设计模式】策略模式
- 什么是IaaS, PaaS和SaaS及其区别
- mybatis的特殊情景语句操作
- 实现一个栈, 其 Push,Pop,Min 操作的 时间复杂度 均为 O( 1 )
- Spring mvc interceptor配置拦截器
- Servlet-4
- 弄不明白抽象类和接口就回头看看
- Netty精粹之轻量级内存池技术实现原理与应用
- 文件备份替换更新批处理
- [opencv编程]244版本跑231版本出错——fatal error LNK1104: 无法打开文件“opencv_core231d.lib”
- Gradle签名打包
- Ijkplayer Android介绍