最大栈
具有栈的功能,并且提供O(1)的时间复杂度来获取最大值max。
思路:使用一个辅助栈assist来维护最大值,最大值为assist的栈顶元素。当入栈的值大于最大值时,将该值压入assist栈,相当于更新了最大值。当有元素出栈时,检查该元素是否为最大值,如果是,则assist出栈,即更新了最大值。
import java.util.Stack;
public class MaxStack {
private Stack<Integer> s;
private Stack<Integer> assist;
public MaxStack() {
s = new Stack<Integer>();
assist = new Stack<Integer>();
assist.push(Integer.MIN_VALUE);
}
public int pop() throws Exception {
if (isEmpty())
throw new Exception("empty stack");
int result = s.pop();
if (result == assist.peek())
assist.pop();
return result;
}
public void push(int i) {
s.push(i);
if (i > max()) {
assist.push(i);
}
}
public int peek() {
return s.peek();
}
public boolean isEmpty() {
return s.isEmpty();
}
public int max() {
return assist.peek();
}
}
最大队列
具有队列的功能,并提供O(1)的时间复杂度获取最大值。
思路:使用两个最大栈来构成一个队列。入队的元素从s1进栈,当有元素出队时,如果s2非空,则从s2出栈。否则,将s1中的元素出栈并从s2中入栈。最大值为s1的最大值和s2的最大值中的较大值。
public class MaxQueue {
MaxStack s1;
MaxStack s2;
public MaxQueue() {
s1 = new MaxStack();
s2 = new MaxStack();
}
public int max() {
int result = s1.max() > s2.max() ? s1.max() : s2.max();
return result;
}
public boolean isEmpty() {
if (s1.isEmpty() && s2.isEmpty())
return true;
return false;
}
public void enqueue(int i) {
s1.push(i);
}
public int dequeue() throws Exception {
if (isEmpty())
throw new Exception("is empty");
if (s2.isEmpty()) {
while (!s1.isEmpty()) {
s2.push(s1.pop());
}
}
return s2.pop();
}
}
分享到:
相关推荐
队列和栈都是运算受限的线性表,只允许在表的一端进行特定的插入和删除操作,该说法正确。 18. **栈和队列的基本属性** 栈和队列都是线性表,但它们分别采用了LIFO和FIFO的规则来约束插入和删除操作,该说法正确...
栈实现 队列实现 双栈实现队列 双队列实现栈 栈实现O(n)求当前栈最大值 http://blog.csdn.net/ssuchange/article/details/17398007
8. 双端队列(Deque,Double-ended Queue):支持在两端进行插入和删除操作,常用于实现滑动窗口最大值等算法。 在学习过程中,通过实例和编程练习加深理解是非常关键的。了解并掌握栈和队列的原理和应用,不仅可以...
### 栈和队列基础知识详解 #### 栈与队列的特性及作用 栈和队列作为两种基本的数据结构,在程序设计中扮演着至关重要的角色。**栈**遵循后进先出(Last In First Out,LIFO)的原则,类似于一叠盘子,你只能在最...
### 栈和队列考研题知识点解析 #### 栈的操作与特性 1. **栈的基本概念**:栈是一种特殊的线性表,只允许在一端进行插入和删除操作,这一端称为栈顶,另一端称为栈底。栈的操作遵循后进先出(LIFO, Last In First ...
### 栈和队列在停车场管理系统中的应用 #### 一、引言 本文将详细介绍如何利用数据结构中的栈和队列来实现一个简单的停车场管理系统。该系统能够有效地管理停车场内的车辆进出情况,并通过栈和队列模拟实际场景:当...
在满队列和空队列的判断上,与栈有所不同。 **栈和队列的应用**: 栈和队列在很多实际场景中都有广泛应用,如: 1. 在计算机系统中,子程序调用和中断处理常使用栈来保存和恢复上下文。 2. 键盘输入缓冲区的管理,...
在初始化栈时,可以设置栈的最大容量和初始栈顶位置为-1表示栈为空。入栈操作需要检查栈是否已满,如果已满则提示,否则将元素插入栈顶并更新栈顶位置。出栈操作需要检查栈是否为空,如果为空则提示,否则删除栈顶...
在这个实验中,我们将关注四种特定的数据结构:共享栈、链栈、循环队列和链队列。这些数据结构在各种算法和应用程序中都有广泛应用。 首先,我们来看共享栈(Shared Stack)。共享栈是一种特殊的栈,其中多个线程...
队列的实现方式有顺序队列和链式队列。顺序队列使用数组,而链式队列使用链表。链式队列在插入和删除操作上有更好的效率,因为它不需要移动大量元素。队列在实际应用中广泛用于任务调度、数据缓冲和多进程通信等场景...
### 数据结构之栈和队列知识点详解 #### 一、基础知识概述 **栈(Stack)** 和 **队列(Queue)** 都是线性数据结构的重要组成部分,它们在算法设计和计算机科学中有广泛的应用。 1. **栈**:栈是一种只允许在一端...
【栈和队列】是数据结构中的两种基本线性数据结构,它们在计算机科学和编程中扮演着重要的角色。在20分钟的试讲教案中,主要目标是让学生理解和掌握这两种数据结构的定义、思想、结构设计以及操作过程。 1. **栈...
- 顺序栈:使用一维数组来存储元素,其优点是访问速度快,但缺点是当栈满时无法直接添加元素,需要考虑动态扩容,这在上述代码中通过设定最大长度(MAXSIZE)和检查栈顶指针(top)来实现。 - 链栈:使用链表结构来...
特殊线性表是数据结构中一类重要的抽象数据类型(ADT),主要包括栈、队列和串。这些结构虽然都是线性结构,但它们在操作上有着独特的要求和特点,使得它们在各种计算问题中扮演着关键角色。 1. **栈**:栈是一种...
在本项目中,我们面临的问题是设计一个模拟停车场管理系统,该系统需使用栈和队列的数据结构来处理车辆的进出。停车场的运作规则是:车辆按照到达时间顺序停放在一个狭长通道内,由北向南排列,如果车位已满,车辆则...
单调队列和单调栈是两种在算法和数据结构领域中常用的工具,它们是基于普通队列和栈的扩展,主要用于处理有序序列中的某些特定问题,如最值查询、滑动窗口最大值或最小值等。这里我们将深入探讨这两种数据结构及其...
在这个主题中,我们将深入探讨两个基本且重要的线性数据结构:栈(Stack)和队列(Queue)。这些数据结构在软件开发中扮演着至关重要的角色,因为它们为解决各种问题提供了基础结构。 **栈**,被称为“后进先出”...
- `int n`:队列的最大容量。 - `int f`:队头指针,指向队头元素的位置。 - `int r`:队尾指针,指向队尾元素的下一个位置,保持队头队尾之间有一个空闲元素的距离。 2. **操作函数**:设计了以下几个主要函数...
双端队列允许在两端进行插入和删除,常用于实现滑动窗口最大值问题、字符串匹配等。优先级队列根据元素的优先级决定出队顺序,常用于Dijkstra算法和Prim算法等最短路径计算。 在编程中,栈和队列可以用数组或链表来...