普通的栈,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. robotframework笔记7

    内部资源 *** Settings *** Library BuiltIn 外部资源 *** Settings *** Library com.mycompany.myproject.MyLib WI ...

  2. exit(0)和exit(1)区别

    exit(0):正常退出程序: exit(1):非正常退出程序: return:返回. return是语言级别的,表示调用堆栈的返回: exit是系统调用级别的,表示一个进程的退出.

  3. Java 集合系列 11 hashmap 和 hashtable 的区别

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  4. [转载]SAP BASIS学习手册

    原文地址:SAP BASIS学习手册作者:sapren     1:)要用scc4定义一个新的client,同时定义好类型(T,P,D等) 2:)用user/pasword: (sap*/pass) ...

  5. protobuf 安装 及 小测试

    参考:http://shift-alt-ctrl.iteye.com/blog/2210885 版本: 2.5.0 百度云盘上有jar包. mac 上安装: 新建:/Users/zj/software ...

  6. JDE客户端get时报错“ERROR:fetch from table F0101 failed”

    客户端开发时发现总报错误“ERROR:fetch from table F0101 failed” 原因是用户ID在地址名册中找不到地址号.修改用户地址号即可.如下图所示

  7. Axis2 webservice 之使用java调用webservice

    在上一篇中写了一个简单了webservice,实现了一个sayHello功能.那么webservice写好之后我们如何使用Java程序来调用webservice呢? 一.java调用的webservi ...

  8. Web API系列

    ASP.NET Web API 是一种框架,用于轻松构建可以访问多种客户端(包括浏览器和移动设备)的 HTTP 服务. ASP.NET Web API 是一种用于在 .NET Framework 上构 ...

  9. 使用HttpClient访问被保护资源

    下面的Android应用需要向指定页面发送请求,但该页面并不是一个简单的页面,只有当用户已经登录,而且登录用户的用户名是crazyit.org时才可访问该页面.如果使用HTTPURLConnectio ...

  10. Convert.ToInt16 与 Convert.ToInt32 区别

    取值的范围不同: int16:-32768 到 32767 int32:-2,147,483,648 到 2,147,483,647