自定义栈-pop-push-min-时间复杂度都为O(1)
1. 简述
首先要决定使用链表结构实现还是顺序结构实现,对于顺序结构实现,当数据满的情况下进行Push时,需要开辟新的数组,进行复制,因此不能保证Push的时间复杂度为O(1);链表结构能够保证Push和Pop的时间复杂度为O(1)。Min的时间复杂度也要求O(1),通过空间换时间,分别记录链表,当包含一个节点时,最小值所在的节点,当包含两个节点时,最小值所在的节点,等等,直到所有节点时,最小值所在的节点。这样相当于两个链表,一个链表保存数值,另一个链表保存第一个链表中,对应节点范围内的最小值所在节点。
2. 实现
using namespace std;
// 友元,链接结构
template<class T>
class Stack;
template<class T>
class Node {
friend class Stack<T>;
private:
T data;
Node<T>* link;
};
template<class T>
class MinNode {
friend class Stack<T>;
private:
Node<T>* min_node;
MinNode<T>* link;
};
template<class T>
class Stack {
private:
Node<T>* head;
MinNode<T>* min_head;
public:
Stack(): head(0),min_head(0) { }
~Stack() {
Node<T>* tmp;
while(head) {
tmp = head->link;
delete head;
head = tmp;
}
tmp = 0;
MinNode<T>* min_tmp;
while(min_head) {
min_tmp = min_head->link;
delete min_head;
min_head = min_tmp;
}
min_tmp = 0;
}
Stack<T>& Push(const T& data) {
Node<T>* tmp = new Node<T>;
tmp->data = data;
tmp->link = head;
head = tmp;
MinNode<T>* min_tmp = new MinNode<T>;
if(min_head > 0 && min_head->min_node->data < head->data)
min_tmp->min_node = min_head->min_node;
else
min_tmp->min_node = head;
min_tmp->link = min_head;
min_head = min_tmp;
return *this;
}
Stack<T>& Pop() {
assert(head > 0);
Node<T> *tmp = head->link;
MinNode<T> *min_tmp = min_head->link;
return *this;
}
void Min(T& data) {
assert(head > 0);
data = min_head->min_node->data;
}
};
int main() {
Stack<int> stack;
int min;
int array[10] = {3,4,5,6,7,2,1,0,9,8};
for(int i=0; i<10; i++) {
stack.Push(array[i]);
stack.Min(min);
cout << min << endl;
}
system("PAUSE");
return 0;
}
3. 说明
· 对于Node, MinNode这样的节点类,把Stack声明为其友元,方便直接使用节点类的私有成员。
· Push和Pop返回值类型为Stack<int>&,这样做是为了实现stack.push(1).push(2).push(3);这样调用方式。
· 在参考资料中,有一份使用deque来实现内部结构的实现方式。
4. 参考
程序员面试题精选100题(02)-设计包含min函数的栈
http://zhedahht.blog.163.com/blog/static/25411174200712895228171/
自定义栈-pop-push-min-时间复杂度都为O(1)相关推荐
- C++ template类模板实现栈 pop push
心得 data = new T[size];这句太坑了,一开始写成了data = new T(size)圆括号,所以一直随机性报错. 我本来以为是ide的问题,在vs2017里就会崩,在dev里不会崩 ...
- 实现一个 能在O(1)时间复杂度 完成 Push、Pop、Min操作的 栈
一,问题描述 实现一个栈(元素遵守先入后出顺序),能够通过 min 方法在 O(1)时间内获取栈中的最小元素.同时,栈的基本操作:入栈(Push).出栈(Pop),也是在O(1)时间内完成的. 二,问 ...
- PTA 栈 (20分)(全网首发)(实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1))
题目描述: 我们知道平凡的栈有几个操作: push(value) 将 value 压入栈 pop() 将栈顶元素弹出, 并返回这个弹出的元素. 现在我们想要在平凡栈的基础上实现以下几个操作: push ...
- 8086CPU的出栈(pop)和入栈(push) 都是以字为单位进行的
8086CPU的出栈(pop)和入栈(push) 都是以字为单位进行的 转载于:https://www.cnblogs.com/yougmi/p/7766751.html
- 含有min()函数的栈,各种操作时间复杂度为O(1)
设计一个栈,定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素.要求函数min.push以及pop的时间复杂度都是O(1). 声明:思想非原创 #include <iostream& ...
- 栈实现:入栈、出栈、取最小元素的时间复杂度都是O(1)。
场景: 实现一个栈,带有出栈(pop),入栈(push),取最小元素(getMin)三个方法.要保证这三个方法的时间复杂度都是O(1). 方法一: 设两个栈A/B,A:存放原始数据,B:栈顶为最小元素 ...
- 栈的push、pop序列
题目:输入两个整数序列.其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序.为了简单起见,我们假设push序列的任意两个整数都是不相等的. 比如输入的push序列是1.2.3 ...
- 学 Win32 汇编[17]: 关于压栈(PUSH)与出栈(POP) 之一
记得刚学多线程的时候, 碰到一个结构: //Delphi 的语法描述 PContext = ^TContext; _CONTEXT = recordContextFlags: DWORD;Dr0: D ...
- 输入两个整数序列。其中一个序列表示栈的push顺序, 判断另一个序列有没有可能是对应的pop顺序。
题目:输入两个整数序列.其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序.为了简单起见,我们假设push序列的任意两个整数都是不相等的. 比如输入的push序列是1.2.3 ...
最新文章
- S2S ×××如何穿越NAT
- 先验概率,后验概率,最大似然估计,最大后验概率
- 【Python】Matplotlib绘制日期型时间序列图
- 网管学习日记-ospf认证
- 机器人开发--技术路线简介
- ev3 android,乐高®头脑风暴教育机器人EV3编程
- 2018腾讯社交广告算法大赛总结/0.772229/Rank11-复习代码
- 六十星系之54廉贞破军坐卯酉
- a轮融资1亿多不多_A轮融资一共就三件重要的事情 B轮最重要的两件事
- Java入门,最全面最简单的Java基础教程
- 关于视频号主页实现一键添加个人微信功能的思路
- 【牛腩新闻发布系统之handler】
- 微信修改基本配置信息
- 阿里云技术大咖分享新内容新交互时代下的新技术、新机会
- word中页眉页脚问题处理方法
- 电脑读卡器,电脑上如何找到读卡器
- 两个女孩全程不带现金,只付加密货币几乎游遍大半个国家是一种什么体验?...
- 在matlab中怎样把图片转化为数据类型,matlab图像数据类型转换
- topsis(优劣解距离法)在matlab上的实现
- Python基础1——读取数据(公众号数据科学实践)