数据结构结构
数据结构分为,物理结构和逻辑结构。
数组和链表是内存中存在的是物理结构,栈和队列是逻辑结构,逻辑机构是抽象概念,需要依赖物理结构得以存在。
一:栈
(先进后出)(java当中的 Stack类就是栈)
栈是一种线性数据结构,遵从先进后出的原则。
栈底:最早进入的元素叫做栈底。
栈顶:最后进入的元素叫做栈顶。
入栈,出栈只考虑第一个和最后一个。时间复杂度都为O(1)
补充:(java当中的 Stack工具类就是栈,push() 入栈、pop() 出栈)
二:队列
(先进先出)
队列是一种线性数据结构,遵从先进先出的原则。
队头:第一个进来的元素叫做队头
队尾:最后一个进来的元素叫队尾
问题:队列先进先出,使用数组实现。每次对头出队后,前面的容量会一直空着。导致后面不停入队,容量不停扩大。
答:采用循环队列模式。
reat=reat + 1%array.length:
向后移动一位,如果到了数组最后位置,就会从数组下标0开始。 时间复杂度都为O(1)
双端队列:队头、队尾都可以入队,出队
优先队列:根据列表中元素的优先级决定出队
三:什么时候用栈和队列
栈:
栈是回溯历史,比如说递归逻辑。就可以用栈来代替 面包屑导航:比如说网页导航,回退功能,一直回退到上一级。
队列:
队列是历史的重演,比如说多线程争夺公平锁的等待队列,就是按照访问顺序来获取线程在队列中的次序的。
四:队列的java代码实现
/**
* 队列:遵循先进先出
*/
public class Queue {
private int [] array; //定义数组
private int front ; //定义队头
private int reat; //定义队尾
public Queue(int capactiy){
this.array = new int[capactiy];
}
/**
* 入队
* @param element 入队元素
* @throws Exception
*/
public void enqueue(int element) throws Exception{
if((reat+1)%array.length==front){ //拿到对队尾的下一个是不是队头
throw new Exception("队列已满");
}
array[reat]=element;
reat=reat + 1%array.length;
}
/**
* 出队
* @return
* @throws Exception
*/
public int dequeue()throws Exception {
if(reat==front){ //队头等于队尾 队列为空
throw new Exception("队列为空");
}
int element= array[front];
front=front + 1 % array.length; //将对头向后移动一位
return element;
}
public void SystemArray() {
for (int i=front; i!=reat; i=i+1%array.length){
System.out.println(array[i]);
}
}
public static void main(String[] args) throws Exception{
Queue queue=new Queue(4);
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
// queue.enqueue(4); //队列长度比数组小 1
queue.dequeue(); //先进先出,
queue.SystemArray();
}
}