数据结构---设计一个栈,push, pop, min 时间复杂度都是 O(1)
普通的栈,push, pop 操作的复杂度是 O(1), 但是如果要找出其中的最小值,则需要 O(N)的时间。
题目要求 min 复杂度也是 O(1), 做法便是 空间换时间,每一步栈的最小值都用一个数组记录下来。。
// copyright @ L.J.SHOU Feb.17, 2014
// design a stack
// min, push, pop take O(1) time
#include <iostream>
using namespace std; /* 无穷大 */
const int INT = 0xfffff; template<typename T>
class MyStack{
public:
MyStack(int capacity=100)
:capacity_(capacity), top_(-1){
stack_ = new T[capacity_];
min_ = new T[capacity_];
} ~MyStack(){
delete [] stack_;
delete [] min_;
} void push(const T& t){
if(top_ < capacity_){
stack_[top_ + 1] = t; if(top_ < 0 || min_[top_] > t){
min_[top_ + 1] = t;
}
else{
min_[top_ + 1] = min_[top_];
} ++ top_;
}
else{
cerr << "stack is full" << endl;
}
} void pop(void){
if(top_ >= 0){
-- top_;
}
else{
cerr << "stack is empty" << endl;
}
} T top(){
if(top_ >= 0){
return stack_[top_];
}
else{
cerr << "stack is empty" << endl;
return INT;
}
} T min(){
if(top_< 0){
cerr << "stack is empty" << endl;
return INT;
}
return min_[top_];
} private:
int capacity_; //max_size
int top_;
T *stack_;
T *min_;
}; int main(void)
{
MyStack<int> s; s.push(1);
s.push(2);
s.push(3); cout << s.top() << endl;
s.pop();
cout << s.top() << endl;
cout << s.min() << endl;
s.pop();
cout << s.top() << endl;
s.pop();
cout << s.top() << endl; return 0;
}
数据结构---设计一个栈,push, pop, min 时间复杂度都是 O(1)的更多相关文章
- 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈 绝对值?相对值
小结: 1. 常数时间内检索到最小元素 2.存储 存储绝对值?相对值 存储差异 3. java-ide-debug 最小栈 - 力扣(LeetCode)https://leetcode-cn.com/ ...
- java——设计一个支持push,pop,top、在恒定时间内检索最小元素的栈。
普通方法: 需要另外一个栈 用来存放每一时刻的min值 巧妙版: 只需要一个stack,stack中存的是与min的差值 但由于min是两个整数之间的差值,有可能会出现差值超过整数边界值的情况,因此要 ...
- 设计一个栈,设计一个max()函数,求当前栈中的最大元素
#include <iostream> using namespace std; #define MAXSIZE 256 typedef struct stack { int top; i ...
- 最小栈问题:题目描述:设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.get ...
- 设计一个Stack,要求Push、Pop、获取最大最小值时间复杂度都为O(1)
面试的时候,面试官让设计一个栈,要求有Push.Pop和获取最大最小值的操作,并且所有的操作都能够在O(1)的时间复杂度完成. 当时真没啥思路,后来在网上查了一下,恍然大悟,只能恨自己见识短浅.思路不 ...
- 实现一个 能在O(1)时间复杂度 完成 Push、Pop、Min操作的 栈
一,问题描述 实现一个栈(元素遵守先入后出顺序),能够通过 min 方法在 O(1)时间内获取栈中的最小元素.同时,栈的基本操作:入栈(Push).出栈(Pop),也是在O(1)时间内完成的. 二,问 ...
- 算法与数据结构题目的 PHP 实现:栈和队列 设计一个有 getMin 功能的栈
刚入手了一本<程序员代码面试指南>,书中题目的代码都是 Java 实现的,琢磨着把这些代码用 PHP 敲一遍,加深印象. 题目:设计一个有 getMin 功能的栈 —— 实现一个特殊的栈, ...
- 设计一个带有getmin功能的栈,保证时间复杂度在O(1)
2017-06-22 20:56:10 需要得到最小值,最简单的思路就是遍历一遍求出最小值.但是这样的时间复杂度会是O(n),不满足O(1)的要求.于是想到在建立一个栈来保存最小值. 具体操作是建立 ...
- 数据结构和算法之栈和队列三:自定义一个栈包含min函数
我们都知道一个栈的特点是后进先出,如果我们要实现在O(1)的时间内找到一个栈里面的最小值,我们应该怎么解决?如果我们采用遍历获取的思路那必然所需要的时间是O(N)与我们所需要的要求明显不符合,这时候我 ...
随机推荐
- python3.x随手笔记1
语法分析 Python程序读取的 解析器 . 解析器的输入流 令牌 ,生成的 词法分析程序 . 这一章描述了如何 词法分析程序把一个文件分解成令牌. Python读取程序文本作为Unicode代码点; ...
- nginx配置 php 单入口
location / { root html; index index.html index.htm index.php; if (!-e $requ ...
- Spring Web Flow 简介
Spring Web Flow 简介 博客分类: 转载 SSH 最近在TSS上看到了一片介绍Spring Web Flow的文章,顺便就翻译了下来,SWF的正式版估计要到6月份才能看到了,目前的例子都 ...
- 5月5日 while、do{}while
while .do{}while 一.while的死循环 while (1 == 1)//只要表达式里是true,就是死循环 { //循环内容 } 二.do{}while 不管while是否满足,首先 ...
- 在express3.0上使用模板
express3.0取消了layout设置,为了能使用模版,经过百度后发现有个express-partials模块可以使用 1:安装 npm install express-partials 模块安装 ...
- 详解Jquery和AngularJs,Servlet中jsonp解决跨域问题(转)
众所周知,jsonp可以解决跨域问题,下面是我在查阅资料和实际项目使用后的一些总结. Jquery中jsonp的使用 //myUrl = "http://localhost:8090/api ...
- 编程思考 PetShop读后感
标准,插拔式的设计思想建立一致的标准是通向“复用”的通道.分层,使其得到的充分的独立.一个东西如果独立了[不是孤立],这个事物就具有很强大的力量,这个和一个人的成长是相同的道理.所以呢,在写程序的过程 ...
- FZU 2029 买票问题 树状数组+STL
题目链接:买票问题 思路:优先队列维护忍耐度最低的人在队首,leave操作ok. vis数组记录从1到n的编号的人们是不是在队列中,top维护队首的人的编号.pop操作搞定. 然后,check操作就是 ...
- JSON.NET 教程(一)
下载地址:http://www.newtonsoft.com/json 参考官网文档:http://www.newtonsoft.com/json/help/html/SerializingJSON. ...
- html圆角提示效果
<fieldset> <legend>标题</legend> 内容 </fieldset>