MinStack
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
- push(x) -- Push element x onto stack.
- pop() -- Removes the element on top of the stack.
- top() -- Get the top element.
- getMin() -- Retrieve the minimum element in the stack.
题目的意思是实现一个栈,能够实现推入,推出,返回顶端元素,获得最小元素的功能
public class MinClass { private Stack<Integer> a = new Stack<Integer>() ;
private Stack<Integer> minStack = new Stack<Integer>(); public void push(int x) {
/**
* 判断最小栈,如果栈为空或者压入的栈值小于栈顶元素,将x压入最小栈
*/
if(minStack.isEmpty() || x<minStack.peek()){
minStack.push(x);
}
a.push(x); }
public void pop() {
/**
* 如果不相等,会把minStack中保存的最小值给推出。所以必须保证minStack中推出
* 的值必须和a中的值一样
*/
if(minStack.peek().equals(a.peek())){
minStack.pop();
}
a.pop();
} public int top() {
return a.peek();
} public int getMin() {
return minStack.peek();
} /**
* 测试
*/
public static void main(){
MinClass obj = new MinClass();
obj.push(10);
obj.push(20);
obj.pop();
obj.push(30);
System.out.println(obj.getMin());
}
}
拓 展
图片来自于维基
堆栈(英语:stack),也可直接称栈 由于堆栈数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In First Out)的原理运作。栈空间有操作系统自动分配,使用完成后有编译器自动释放,通常用来存放函数的参数值、局部变量的值等。
栈使用的是靠近ALU的一级缓存,他们通常是在调用时处于存储空间中,调用完毕后就会立即释放。与“堆(Heap)"不同,堆内存有程序员释放那个,存放于二级缓存中,结构类似于链表,程序员分配时内存变量的值不一定是连续的,因此,堆处理的速度相比与栈来说速度要慢一些!
(截图来自 计算机系统概论)
如图所示,a)有5个连续的存储空间,每个存储单元为1个字节(这也是目前操作系统内存结构的排列方式,类似于一个大的字节数组)。R6代表栈顶寄存器,用来存储栈顶元素的指针。b)当往栈中push一个元素18以后,栈顶元素指针加1,其他地址不变。c)往栈中压入3个元素后的结果,可以看到不断修改栈顶指针的大小。d)弹出2个元素的结果
下面我们用Java代码实现栈,前文已经说明,实现栈的方式可以有数组,也可以有链表来实现(因为这两个数据结构都是线性结构)
Java的SDK中封装好的有一个Stack,他的常用方法有
empty()
peek()
pop()
push(E item)
/**
* 栈的数组实现方式
* @author CYW
*/
public class ArrayStack {
private long[] stackArray;//数组
private int stackSize;//记录存储记录的最大的条数
private int top = -1;//记录栈顶位置 // 记录分配存储空间的大小
public ArrayStack(int s){
stackArray = new long[s];
top = -1;
stackSize = s;
} public long pop(){
return stackArray[top--];
} public void push(int x){
stackArray[++top] = x;
} public long peek(){
return stackArray[top];
} public boolean isEmpty(){
return (stackArray.length == 0);
} // 测试
public static void main(){
ArrayStack obj = new ArrayStack(100);
obj.push(100);
obj.push(20);
obj.push(10);
obj.push(200);
obj.push(1000);
obj.pop();
/**
*
*/
for (int i = 0;i<obj.top;i++){
System.out.println(obj.stackArray[i]);
}
}
}
需要注意的一点是:我们在输出数组元素的时候不能根据数组的长度来判断,而必须根据站顶的top来判断!
C++代码
struct Node{
struct Node* pPre;
int data;
}; class ListStack{
private:
//定义指向栈顶元素的指针
struct Node *top; public: void push(int data){
//创建新的变量
struct Node *node = new struct Node();
node->data = data;
node->pPre = top;
//重新定义top的指向
top = node;
} int pop(){ //重新定义top的指向
int temp = top->data;
top =top->pPre;
//返回输出结果
return temp;
} int peek(){
return top->data;
}
//判断是否为空
bool isEmpty(){
if(top){
return true;
}else{
return false;
} } }; int _tmain(int argc, _TCHAR* argv[])
{
ListStack stack;
stack.push(10);
stack.push(20);
stack.push(30);
stack.push(40);
stack.push(50); cout<<stack.pop()<<endl;
cout<<stack.peek()<<endl;
cout<<stack.pop()<<endl;
cout<<stack.pop()<<endl;
cout<<stack.pop()<<endl;
cout<<stack.peek()<<endl;
cout<<stack.pop()<<endl; if(stack.isEmpty()){
cout<<"栈中数据为空!"<<endl;
}else{
stack.pop();
}
return 0;
}
当然,上面代码中有很多不安全的地方,仅仅是学习的目的,http://shmilyaw-hotmail-com.iteye.com/blog/1825171 从Java给出了比较好的解释。
MinStack的更多相关文章
- LintCode MinStack
Implement a stack with min() function, which will return the smallest number in the stack. It should ...
- minStack实现
设计包含 min 函数的栈(栈)定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素.要求函数 min.push 以及 pop 的时间复杂度都是 O(1). #include <a ...
- leetcode算法学习----155. 最小栈(MinStack )
下面题目是LeetCode算法155题: https://leetcode.com/problems/min-stack/ 题目1:最小函数min()栈 设计一个支持 push,pop,top 操作, ...
- [LeetCode] 155. minStack 设计最小栈
注意:getMin()时间复杂度为O(1) 最原始的方法: class MinStack(object): def __init__(self): """ initial ...
- [LeetCode] Min Stack 最小栈
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. pu ...
- BUG-FREE-For Dream
一直直到bug-free.不能错任何一点. 思路不清晰:刷两天. 做错了,刷一天. 直到bug-free.高亮,标红. 185,OA(YAMAXUN)--- (1) findFirstDuplicat ...
- 二刷Cracking the Coding Interview(CC150第五版)
第18章---高度难题 1,-------另类加法.实现加法. 另类加法 参与人数:327时间限制:3秒空间限制:32768K 算法知识视频讲解 题目描述 请编写一个函数,将两个数字相加.不得使用+或 ...
- (lintcode全部题目解答之)九章算法之算法班题目全解(附容易犯的错误)
--------------------------------------------------------------- 本文使用方法:所有题目,只需要把标题输入lintcode就能找到.主要是 ...
- [ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 1338+2442+1442)
再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习. 首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个 ...
随机推荐
- linq 多条件查询
Linq 进行多条件查询的时候使用PredicateBuilder帮助类可以很好的解决. 类的源码: public static class PredicateBuilder { /// <su ...
- mysql 常用配置
1. 帐号不允许从远程登陆,只能在localhost 这个时候只要在localhost的那台电脑,登入mysql后,更改 “mysql” 数据库里的 “user” 表里的 “host” 项,从“loc ...
- javaBean与Map<String,Object>互转
背景:有时候想不通阿帕奇的BeanUtils是怎么进行map和Bean互相转化的. 工作闲暇之余,自己写个一小段代码,一探究竟,试试才发现,原来一切并非我们想的那么什么和复杂. 注:这里只是简单实例, ...
- 第二章——建立一个HelloWorld项目,练习使用git的add/commit/push/pull/fetch/clone等基本命令。比较项目的新旧版本的差别-----答题者:徐潇瑞
1.首先下载安装git,很简单所以就不详细说了,当弹出一个类似的命令窗口的东西,就说明Git安装成功 2.因为Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识 3.接着,注册githu ...
- 转 父表字表统计查询的sql练习
create table father( f_id number(2) primary key, f_name varchar2(10) ); create table s ...
- Eclipse4.6(Neon) + Tomcat8 + MAVEN3.3.9 + SVN项目完整环境搭建
软件清单 jdk-8u102-windows-x64.exe eclipse-inst-win64.exe (Eclipse4.6 Neon) apache-tomcat-8.5.5-windows- ...
- bootstrap中的Tooltips工具提示的使用问题
在使用bootstrap中的Tooltips时,官方文档中的实例代码若直接放在.container 或 .container-fluid类中时,四个button悬停之后会把button之间的margi ...
- 在cocos2d里面如何使用Texture Packer和像素格式来优化spritesheet
免责申明(必读!):本博客提供的所有教程的翻译原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作 ...
- C# 中 async/await 调用传统 Begin/End 异步方法
最近在改进园子的图片上传程序,希望实现用户上传图片时同时将图片文件保存在三个地方:1)服务器本地硬盘:2)又拍云:3)阿里云OSS.并且在保存时使用异步操作. 对于异步保存到本地硬盘,只需用 Stea ...
- 为什么在Mac中无法用k web运行ASP.NET 5程序
k web对应的命令如下: "web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebLi ...