剑指offer 21---实现一个栈, 要求实现Push( 出栈) 、 Pop( 入栈) 、 Min( 返回最小值的操作) 的时间复杂度为O(1)
来源:互联网 发布:天津青蛙网络 编辑:程序博客网 时间:2024/06/10 04:24
栈:先进后出
实现方法:
利用栈的性质,首先建立q1,q2两个栈,两个栈均为空。
1.插入数据时,第一个数据在q1,q2中均插入。
2.后面的数据依次插入q1中,每次插入一个数据后均和q2中的栈顶比较,如果此时数据大于s2的栈顶,则该数据不插入q2 中,如果此时数据小于或等于此时q2的栈顶,则将该数据插入s2,依次进行。
3.当所有数据入栈完毕后,s2的栈顶存储的即为该列所有数据的最小值。
代码实现如下:
#include <iostream>#include <stack>#include <Windows.h>using namespace std;template <class T>class Stack{public:Stack(){}~Stack(){}void Push(const T& data) //入栈{q1.push(data); //不做判断,先将所有数据压入q1if (q2.empty() || data <= q2.top()) //如果q2为空或者要插入的数据小于或等于q2的栈顶,即插入q2中,否则不插入q2{q2.push(data);}}void Pop() //出栈{if (!q1.empty()) //q1不为空时,才可出栈{if (q1.top() == q2.top()) //如果存在q1和q2有相同数据,即说明,该数据压入了q1和q2{q2.pop();}q1.pop(); //q1每次均需要出栈}}T Min() //找栈中的最小数据{//即q2的栈顶就是用来存放最小数据if (q2.empty()){return 0;}return q2.top();}void Print() //打印{size_t size = q1.size();cout << "q1:";while (size){cout<< q1.top() << "->";q1.pop();--size;}cout << endl;size = q2.size();cout << "q2:";while (size){cout<< q2.top() << "->";q2.pop();--size;}cout << endl;}protected:stack<T> q1; //栈1stack<T> q2; //栈2};
PS:因为打印时,每一次打印均pop一次数据,当所有数据打印完时,q1,q2中已经没有数据,所以无法将pop前,pop后结果展现在一起,每次pop数据,这样可以防止内存泄漏。
一、原始插入的结果:
#include "stack.h"void TestStack(){Stack<int> pp;pp.Push(16);pp.Push(3);pp.Push(6);pp.Push(7);pp.Push(4);pp.Push(2);pp.Push(1);pp.Push(9);pp.Push(10);pp.Push(8);cout <<"pp.Min:"<< pp.Min() << endl; pp.Print();}int main(){TestStack();system("pause");return 0;}
二、pop后的结果
#include "stack.h"void TestStack(){Stack<int> pp;pp.Push(16);pp.Push(3);pp.Push(6);pp.Push(7);pp.Push(4);pp.Push(2);pp.Push(1);pp.Push(9);pp.Push(10);pp.Push(8);//pp.Print(); Pop前打印的为原始插入的数据,每一次打印时均会pop掉栈中的数据,数据打印完时,q1,q2为空,优点是可以防止内存泄漏。所以看原始现象时,需要将下面代码注释掉pp.Pop();pp.Pop();pp.Pop();pp.Pop();pp.Pop();//pp.Pop();//pp.Pop();//pp.Pop();cout << "pp.Min:" << pp.Min() << endl;pp.Print();}int main(){TestStack();system("pause");return 0;}
3 1
- 剑指offer 21---实现一个栈, 要求实现Push( 出栈) 、 Pop( 入栈) 、 Min( 返回最小值的操作) 的时间复杂度为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)
- ~实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)~
- 1. 实现一个栈,要求实现 Push (出栈)、 Pop (入栈)、 Min (返回最小值的操作) 的时间复杂度为 O(1)
- 实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
- 实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
- 实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
- 实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
- 实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
- 实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
- 实现一个栈Stack,要求实现Push(入栈)、Pop(出栈)、Min(返回最小值的操作)的时间复杂度为O(1)
- 实现一个栈Stack,要求实现Push(入栈)、Pop(出栈)、Min(返回最小值的操作)的时间复杂度为O(1)
- 实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
- 实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、 Min(返回最小值的操作)的时间复杂度为O(1)
- Python调用Matlab引擎
- spacemacs复制minibuffer的内容到buffer里
- CF
- 520. Detect Capital
- JAVAEE-文件下载
- 剑指offer 21---实现一个栈, 要求实现Push( 出栈) 、 Pop( 入栈) 、 Min( 返回最小值的操作) 的时间复杂度为O(1)
- 《疯狂JAVA讲义》之十一——Java基本数据类型之二
- NDK探究之旅《一》——对jni和NDK的认识
- 【HTML5入门】java获取util date类型当前系统前一天,当天,后天日期
- java内存
- 网页有frame 怎么获得里面的元素
- NYOJ-1237-最大岛屿
- 自定义异常
- 用Swift实现iOS相机及相册图片上传