1. 为什么要使用双向栈?
通过上一篇博客 -特殊的线性表(栈),不难知道栈的顺序存储(数组实现)性能相对较好,因为它不存在插入和删除时移动元素的问题,但是它有一点缺陷:要事先确定数组存储容量的大小,万一不够,就需要扩充数组容量。这时双向栈就派上用场了,它可以最大限度的利用事先开辟的存储空间。
2.
双向栈有什么特点?
数组有两个端点,两个栈有两个栈底,让一个栈的栈底为数组的始端,即下标为0处,另一个栈为数组的末端,即下标为数组长度M-1处。这样,两个栈如果增加元素,就会从两端点向中间延伸(如下图)。
3. Java实现双向栈
// 双向栈的数组实现
public class ShareStack<T> {
private Object[] arr; // 数组实现栈的操作
private int top1; // 栈1: 栈顶指针
private int top2; // 栈2: 栈顶指针
private static Integer DEFAULT_SIZE = 16; // 数组默认长度
private static final Integer STACK_1 = 1; // 栈1
private static final Integer STACK_2 = 2; // 栈2
public ShareStack() {
init();
}
public ShareStack(int size) {
DEFAULT_SIZE = size;
init();
}
// 初始化栈
public void init() {
arr = new Object[DEFAULT_SIZE];
this.top1 = -1;
this.top2 = DEFAULT_SIZE;
}
// 压栈
public boolean push(int stackNum, T data) {
if (top1 + 1 == top2) { // 栈已满
System.out.println("栈已满,不能再push元素了..");
return false;
}
if (stackNum == STACK_1) { // 操作的是栈1
arr[++top1] = data; // 栈1前进一位
return true;
} else if (stackNum == STACK_2) { // 操作的是栈2
arr[--top2] = data; // 栈2后退一位
return true;
} else {
System.out.println("请输入正确的栈编号: 1 或 2");
return false;
}
}
// 弹栈
@SuppressWarnings("unchecked")
public T pop(int stackNum) {
if (stackNum == STACK_1) { // 操作的是栈1
if (top1 == -1) {
System.out.println("栈1已经是空栈...");
return null;
}
return (T) arr[top1--]; // 栈1后退一位
} else if (stackNum == STACK_2) { // 操作的是栈2
if (top2 == DEFAULT_SIZE) {
System.out.println("栈2已经是空栈...");
return null;
}
return (T) arr[top2++]; // 栈2前进一位
} else {
System.out.println("请输入正确的栈编号: 1 或 2");
return null;
}
}
// 获取栈顶元素
@SuppressWarnings("unchecked")
public T getTop(int stackNum) {
if (stackNum == STACK_1) {
if (this.top1 != -1) {
return (T) arr[top1];
}
} else if (stackNum == STACK_2) {
if (stackNum != DEFAULT_SIZE) {
return (T) arr[top2];
}
} else {
System.out.println("请输入正确的栈编号: 1 或 2");
}
return null;
}
// 获取数组长度
public int size() {
return DEFAULT_SIZE + top1 + 1 - top2;
}
// 判断是否为空栈
public boolean isEmpty() {
return this.top1 == -1 && this.top2 == DEFAULT_SIZE;
}
// 置为空栈
public boolean clear() {
this.top1 = -1;
this.top2 = DEFAULT_SIZE;
return true;
}
// 测试方法
public static void main(String[] args) throws Exception {
ShareStack<Integer> stack = new ShareStack<Integer>();
stack.push(1, 1);
stack.push(2, 2);
stack.pop(1);
stack.pop(2);
}
}
4. 什么时候使用双向栈?
1.)两个栈的空间需求有相反关系时,也就是当一个栈增长时另一个栈在缩短的情况。
2.) 两个栈需要具有相同的数据类型,如果数据类型不同,将会使问题复杂化。
分享到:
相关推荐
大话数据结构 .pptx
接着,书中会深入讲解存储层次结构,从CPU缓存到主内存,再到外部存储设备,阐述如何通过缓存策略优化数据访问速度。此外,还会涉及虚拟内存管理,解释如何在物理内存不足时,利用硬盘空间作为虚拟内存,确保系统的...
《大话数据分析:Tableau数据可视化实战》的数据集是一份重要的资源,对于想要学习和提升Tableau数据可视化技能的人来说极具价值。Tableau是一款强大的商业智能工具,它允许用户通过直观的拖放界面来探索和可视化...
数据结构是计算机科学中的一个重要概念,它主要研究如何组织和存储数据,以便可以高效地访问和修改这些数据。数据结构的选择对于算法的效率有着直接的影响。本次内容将围绕“栈”、“队列”、“树”以及“二叉树”等...
大数据也可以定义为来自各种来源的大量非结构化或结构化数据。从学术角度而言,大数据的出现促成广泛主题的新颖研究。这也导致各种大数据统计方法的发展。大数据并没有统计学的抽样方法;它只是观察和追踪发生的事情...
大话数据结构
大话存储2:存储系统架构与底层原理极限剖析》内容简介:网络存储是一个涉及计算机硬件以及网络协议/技术、操作系统以及专业软件等各方面综合知识的领域。目前国内阐述网络存储的书籍少之又少,大部分是国外作品,对...
大话存储:存储系统底层架构原理极限剖析(终极版)第4部分 大话存储:存储系统底层架构原理极限剖析(终极版)第4部分
3. 存储系统的基础技术:讨论了计算机IO基本概念、硬盘物理结构、盘片数据结构和工作原理等基础知识。 4. RAID技术:书中有对七种常见RAID技术原理的详细分析,并对性能细节进行了对比。 5. 磁盘阵列技术:涉及...
大话存储:存储系统底层架构原理极限剖析(终极版)第3部分 大话存储:存储系统底层架构原理极限剖析(终极版)第3部分大话存储:存储系统底层架构原理极限剖析(终极版)第3部分
数据结构是组织和存储数据的方式,以便于高效地访问和修改。C和C++提供了多种内置数据结构,如数组、链表、栈、队列、哈希表、树等。每种数据结构都有其特定的用途和操作效率: 1. **数组**:一组相同类型的元素...
个人自用
"大话存储2:存储系统架构与底层原理极限剖析" 本节将对存储系统的基本概念、技术和架构进行详细介绍。存储系统是计算机系统中的一种复杂系统,主要负责数据的存储、管理和保护。它可以是一个独立的硬件设备,也...
基于《大话数据结构》进行数据结构的学习
大话存储:存储系统底层架构原理极限剖析(终极版)_张冬2015.01_P989
Android之大话设计模式——:抽象工厂模式借鉴.pdf
本课件涵盖了数据结构的多个重要主题,包括线性表、栈和队列、串、数和二叉树、图、查找以及内部排序。 线性表是最基本的数据结构之一,它是一组按顺序排列的元素集合。每个元素都有一个唯一的索引,可以实现快速...