序言
在前面几篇文章中我们分别讲的数据结构中的几种简单排序(JAVA数据结构和算法-简单排序之冒泡排序、 JAVA数据结构和算法-简单排序之选择排序 、JAVA数据结构和算法-简单排序之插入排序 )和对象排序的使用(数据结构和算法-简单排序之对象排序 )。
在之后近几篇的文章中,我们将要讲解集中不同的结构类型,分别是栈、队列、有序队列。在了解栈之前我们先了解一下之前数据存储结构与之后存储结构的区别。
1、程序员的工具
数组是前面已经介绍过的数据存储结构,和其他数据结构(链表、树)一样,都适用于数据库应用中做数据吉利。它常用于记录那些对应于现实世界的对象和活动的数据,如职员档案、目录、上午数据等。这些结构便于数据的访问:它们易于进行插入、删除和查找特定数据项的操作。
然而之后要讲解的数据结构和算法更多的是作为程序员的工具来运用。它们主要作为构思算法的辅助工具,而不是完全的数据存储工具。这些数据结构的生命周期比那些数据库类型的结构要短得多。在程序操作执行期间它们才被创建,通常用它们去执行某项特殊的任务;当完成任务之后,它们就要被销毁掉。
2、受限的访问
在数组中,若知道数据项的下标,便可以立即访问该数据项;或者通过顺序搜索数据项,访问到数据中的各项数据。而在栈和队列等数据结构中,访问是受限的,即在特定时候只有一个数据项可以被读取或者被删除。
3、更加抽象
栈、队列和优先级队列是比数组和其他数据存储结构更为抽象的结构。主要通过接口对栈、队列和优先级队列进行定义,这些接口表明通过它们可以完成的操作,而它们的主要实现机制对用户来说是不可见的。
例如:栈的主要机制可以用数组来实现,也可以用链表来实现。优先级队列的内部实现可以用数组或一种特别的树-堆来实现。
栈
代码实现
/** * Created by Bruce on 2020/8/13 * 使用数组实现栈 **/public class Stack_01 { private int maxSize; private long[] stackArray; private int top; public Stack_01(int maxSize) { this.maxSize = maxSize; stackArray = new long[maxSize]; top = -1; } /** * 是否为空 * @return */ public boolean isEmpty(){ return top == -1;//栈顶指针为默认值-1,则代表为空 } /** * 栈是否已满 * @return */ public boolean isFull(){ return top == maxSize - 1;//栈顶指针为限制数量-1 } /** * 向栈中压入元素 * @param value * @return */ public boolean push(long value){ if (isFull()){//已满压入失败 return false;//实际使用中-可抛出异常处理 } stackArray[++top] = value;//栈顶压入-top是在插入数据项之前递增的 return true; } /** * 弹栈 * @return */ public long pop(){ if(isEmpty()){//栈为空 return -1;//实际使用中-可抛出异常处理 } return stackArray[top--];//先返回再递减 } /** * 查看栈顶元素 * @return */ public long peek(){ if(isEmpty()){//栈为空返回-1; return -1L;//实际使用中-可抛出异常处理 } return stackArray[top]; } public static void main(String[] args) { int maxSize = 10; Stack_01 stack = new Stack_01(maxSize); System.out.println("入栈:"); for(int i = 0; i
数据打印:
入栈:
0 10 20 30 40 50 60 70 80 90
弹栈:
90 80 70 60 50 40 30 20 10 0
解析
本文摘要自《Java数据结构和算法(第二版)》