普通的栈,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)的更多相关文章

  1. 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈 绝对值?相对值

    小结: 1. 常数时间内检索到最小元素 2.存储 存储绝对值?相对值 存储差异 3. java-ide-debug 最小栈 - 力扣(LeetCode)https://leetcode-cn.com/ ...

  2. java——设计一个支持push,pop,top、在恒定时间内检索最小元素的栈。

    普通方法: 需要另外一个栈 用来存放每一时刻的min值 巧妙版: 只需要一个stack,stack中存的是与min的差值 但由于min是两个整数之间的差值,有可能会出现差值超过整数边界值的情况,因此要 ...

  3. 设计一个栈,设计一个max()函数,求当前栈中的最大元素

    #include <iostream> using namespace std; #define MAXSIZE 256 typedef struct stack { int top; i ...

  4. 最小栈问题:题目描述:设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

    MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.get ...

  5. 设计一个Stack,要求Push、Pop、获取最大最小值时间复杂度都为O(1)

    面试的时候,面试官让设计一个栈,要求有Push.Pop和获取最大最小值的操作,并且所有的操作都能够在O(1)的时间复杂度完成. 当时真没啥思路,后来在网上查了一下,恍然大悟,只能恨自己见识短浅.思路不 ...

  6. 实现一个 能在O(1)时间复杂度 完成 Push、Pop、Min操作的 栈

    一,问题描述 实现一个栈(元素遵守先入后出顺序),能够通过 min 方法在 O(1)时间内获取栈中的最小元素.同时,栈的基本操作:入栈(Push).出栈(Pop),也是在O(1)时间内完成的. 二,问 ...

  7. 算法与数据结构题目的 PHP 实现:栈和队列 设计一个有 getMin 功能的栈

    刚入手了一本<程序员代码面试指南>,书中题目的代码都是 Java 实现的,琢磨着把这些代码用 PHP 敲一遍,加深印象. 题目:设计一个有 getMin 功能的栈 —— 实现一个特殊的栈, ...

  8. 设计一个带有getmin功能的栈,保证时间复杂度在O(1)

    2017-06-22  20:56:10 需要得到最小值,最简单的思路就是遍历一遍求出最小值.但是这样的时间复杂度会是O(n),不满足O(1)的要求.于是想到在建立一个栈来保存最小值. 具体操作是建立 ...

  9. 数据结构和算法之栈和队列三:自定义一个栈包含min函数

    我们都知道一个栈的特点是后进先出,如果我们要实现在O(1)的时间内找到一个栈里面的最小值,我们应该怎么解决?如果我们采用遍历获取的思路那必然所需要的时间是O(N)与我们所需要的要求明显不符合,这时候我 ...

随机推荐

  1. Qt之QPauseAnimation

    简述 QPauseAnimation类为QSequentialAnimationGroup提供了一个暂停. 如果你想为QSequentialAnimationGroup动画之间添加延迟,可以插入一个Q ...

  2. 更准确的mysql全文索引

    MYSQL自带的全文索引在查找数据的时候,有非常多的限制,如字符少于3个不能搜索,常用字不能搜索 但mysql 的like进行查询的时候又非常的慢 但你需要用到比较准确的查询的时候,要么不用mysql ...

  3. IDEA 创建Java Web项目

    发现项目目录没有classes和lib目录,所以自己创建 点击OK,选中"Jar Directroy"-->点击"OK" 然后直接把jar复制到这个目录下 ...

  4. 20145236 《Java程序设计》实验五实验报告

    20145236 实验五 Java网络编程 实验内容 1.运行TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成代码,一人加密后通过TC ...

  5. LaTeX测试

    首先输出个\(\LaTeX\ \),看上去非常高端! 然后上论文,测试以后发现不行QAQQQ 貌似只能插入一个公式来着...比如:$\theta(\vec{u},\ \vec{v}) = arccos ...

  6. apache2.4域名配置参数

    apache2.4和 2.2版本的配置有区别 2.4的配置如下 <VirtualHost *:80>DocumentRoot /www/web/projectServerName www. ...

  7. ANGULAR 开发用户选择器指令

    在开发表单时,我们需要使用经常需要使用到用户选择器,用户的数据一般使用如下方式存储: 用户1,用户2,用户3   我们可以使用angular指令实现选择器. <!DOCTYPE html> ...

  8. eclipse 连接 mysql

    1.下载驱动. 2.eclipse->add extend jars -> 添加驱动. 3.测试: 在mysql 建立数据库和表,在eclipse 里对数据库进行操作. 代码: mysql ...

  9. TopCoder SRM 582 ColorfulBuilding

    DP  思路是三维,但是时间肯定会超时,需要根据其特殊性质加两个标记数组,优化成二维. 刚开始想了N久N久,没感觉,还是动手画了一下才有用呀,意淫再久,不如动手呀. 代码: #include<i ...

  10. exe转msi

    1.起因 由于域推送只支持msi安装包,而很多常用的工具比如Adobe Flash Player.exe.SilverLight.exe都是exe格式的,于是引出要将exe转成silent msi的工 ...