数据结构最优解之栈与队列Lab1
来源:互联网 发布:文字编辑软件 编辑:程序博客网 时间:2024/06/05 15:16
前言
我的GitHub博客传送门
首先,简单地介绍一下栈与队列。
从”数据结构”的角度看,它们都是线性结构,即数据元素之间的关系相同。但它们是完全不同的数据类型。除了它们各自的基本操作集不同外,主要区别是对插入和删除操作的”限定”。
- 栈(Stack)是限定只能在表的一端进行插入和删除操作的线性表。
- 队列(Queue)是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。
栈必须按”后进先出”的规则进行操作,而队列必须按”先进先出”的规则进行操作。
然后,这个系列都是笔者在学习左程云的程序员代码面试指南时进行的整理。
题目:设计一个有getMin功能的栈
实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
要求
- pop、push、getMin操作的时间复杂度都是O(1)
- 设计的栈类型可以输用现成的栈结构
思路分析
- 使用两个栈实现,一个栈stackData用来保存
当前栈
的元素。 - 另一个栈stackMin保存
每一步
的最小值。
栈的压入规则
- 当前数据为newNum,将其压入stackData,判断stackMin是否为空。
- 为空,newNum压入stackMin。
- 不为空,比较newNum与stackMin的栈顶元素哪一个更小。
- newNum更小或相等,newNum压入stackMin。
- stackMin栈顶元素小,stackMin不压入任何该数据。
栈的弹出规则
- stackData弹出栈顶元素,记为value。比较value与stackMin栈顶元素的大小。
- value等于stackMin栈顶元素时,stackMin弹出栈顶元素;
- value大于stackMin栈顶元素时,stackMin不弹出栈顶元素。
- 返回value。
代码实现
private Stack <Integer> stackData; private Stack <Integer> stackMin; public Lab1_1() { this.stackData = new Stack<Integer>(); this.stackMin = new Stack<Integer>(); } public void push(int newNum) { if (this.stackMin.isEmpty()) { this.stackMin.push(newNum); } else if (newNum <= this.getMin()) { this.stackMin.push(newNum); } this.stackData.push(newNum); } public int pop() { if (this.stackData.isEmpty()) { throw new RuntimeException("Your stack is empry"); } int value = this.stackData.pop(); if (value == this.getMin()) { this.stackMin.pop(); } return value; } public int getMin() { if (this.stackData.isEmpty()) { throw new RuntimeException("Your stack is empry"); } return this.stackMin.peek(); }
后记
该方法是以stackMin栈保存stackData每一步的最小值,其所有操作的时间复杂度均为O(1)。
核心操作是比较每个stackData栈的弹出元素与stackMin栈的栈顶元素,确保stackMin中存有最小项。
相对来说,压入操作省下了空间,代价是弹出操作用时稍长。
0 0
- 数据结构最优解之栈与队列Lab1
- 数据结构之栈与队列
- 数据结构之栈与队列
- 数据结构之:栈与队列
- 数据结构与算法之----栈与队列
- 数据结构与算法之栈与队列
- 数据结构与算法之栈与队列
- 数据结构与算法之栈与队列
- 数据结构与算法之栈与队列
- “栈与队列”之栈--基本数据结构
- 数据结构之栈与队列学习总结
- 数据结构与算法之表、队列、栈
- 数据结构与算法之栈和队列
- 数据结构与算法之栈和队列
- python 数据结构三 之 栈与队列
- python数据结构之栈与队列
- 数据结构与算法之队列
- 数据结构之堆栈与队列
- 移植openssh到mini2440开发板
- 网页安全之页面禁用复制粘贴
- JSP动作标识之 include,forward,useBean
- C#的Equals方法
- DrawerLayout 在 Android 4.4 和 Android 5.0 以上实现沉浸状态栏和导航栏的方法
- 数据结构最优解之栈与队列Lab1
- Axure RP8.0 部件
- Iptables详解
- iOS最好用的弹出框
- Spring源码分析(1)
- Android调用三星系统照相机照片显示问题
- 初探EventBus3
- wordpress如何去掉顶部工具条
- IDEA入门级使用教程----你怎么还在用eclipse?