在数据结构中,我们比较熟悉的有:数组,链表,树,栈,队列。那么就这几种基本的数据结构来说,也是存在一些应用上的区别的。
数组,链表,树:这几种是最基本的数据结构,常常用来实际存储数据。
栈,队列这两种数据结构一般是用作程序员实现算法时的工具,在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;
}
}
}
那么以上就是队列和栈的简单理解了。
转载于:https://blog.51cto.com/qkkcoolmax/1614452