在数据结构中,我们比较熟悉的有:数组,链表,树,栈,队列。那么就这几种基本的数据结构来说,也是存在一些应用上的区别的。
数组,链表,树:这几种是最基本的数据结构,常常用来实际存储数据。
栈,队列这两种数据结构一般是用作程序员实现算法时的工具,在java中有一些jdk提供的类,是对相应接口的实现,比较抽象,且有访问受限的特性。
1.栈
栈一般基于数组或者链表来制作,数组和链表是栈中实际存储数据所使用的数据结构。它最基本的特性是“先进后出,后进先出”,不满足这条规则的数据结构不是栈。
在java中jdk里已经有一些实现的栈,或者具有栈的功能的更强大的类型。那么为了解栈的特性,我们基于数组DIY一个简单的栈。
思路:栈一般有一个栈顶指针top,指向栈顶元素的位置。实际存储数据的结构我们使用数组。另外栈应该具有一些基本的操作,push(入栈),pop(出栈),peek(查看栈顶元素),isEmpty(栈是否空),isFull(栈是否满)。
下面是java代码:
//将域都设为私有,只能通过公有的方法访问,以满足栈的访问受限特性 public class Stack{ private int[] elements; //栈中存储的元素是int型的,用int型数组来存储 private int top; //栈顶指针,指向栈顶 private int MAXSIZE = 20; // 用于存储数据的数组长度,也是栈的最大容量 public Stack(){ this.elements = new int[MAXSIZE]; top = -1; } //入栈 public void push(int index) { stackElements[++top] = index; } //出栈 public int pop() { return stackElements[top--]; } //查看栈顶元素 public int peek() { return stackElements[top]; } // 查看栈是否为空 public boolean isEmpty() { if (top == -1) { return true;//为空 } else { return false; } } }
那么这就是一个最简单的栈。刚才我们提到java中已经有一些内置的类,如LinkedList等等,这些类型从其提供的方法来看,既可以是栈也可以是队列或者其他的数据结构。那么如果我们的算法希望用到一个严格的栈。我们可以自己diy一个栈,像上面的程序那样。同时,我们也可以自己写一个类来封装那些高级的类。将其设为我们自定义类中的private域,然后封装一些他的满足栈特性的公有方法作为接口暴露出来,供其他类访问即可。
2.队列
队列一般来说具有先进先出特性。那么队列一般也是基于数组和链表来实现的,也就是说其底层用来实际存储数据的数据结构也是数组或者链表。
那么,一般来说,队列有基础队列,循环队列,双端队列,优先级队列。后两种队列就不再具有先进先出的特性了。但是其也是基础队列的变种。
双端队列,简单来说就是两边都可以remove的队列。
优先级队列呢,就是说数据在队列中是有一个特定的顺序的,所有插入时,要先排序,再从指定位置插入,所以不再是只能从rear队尾插入。其他的和基础队列都是类似的。
下面我们diy一个简单的循环队列。
//一个循环队列,先进先出,基于数组实现、 // public class Queue { private int MAXSIZE;//队列的最大长度 private long[] elements; private int front;//指向队首位置 private int rear;//指向队尾位置 private int nums;//队列中实际元素的个数,可用于判断队列空满状态 public Queue(int MAXSIZE) { this.MAXSIZE = MAXSIZE; elements = new long[MAXSIZE]; this.front = 0; this.rear = -1; this.nums = 0; } public void add(long ele){ if(rear==(MAXSIZE-1)){ rear = -1; } elements[++rear] = ele; nums++; } public long remove(){ long temp = elements[front++]; if(front==MAXSIZE){ front = 0; } nums--; return temp; } public long peek(){ return elements[front]; } public boolean isEmpty(){ if(nums==0){ return true; }else return false; } public boolean isFull(){ if(nums==MAXSIZE){ return true; }else{ return false; } } }
那么以上就是队列和栈的简单理解了。