简介
栈是“后进先出”(LIFO,Last InFirst Out)的数据结构,与之相反,队列是“先进先出”(FIFO,First InFirst Out)的数据结构
队列的作用就像售票口前的人们站成的一排一样:第一个进入队列的人将最先买到票,最后排队的人最后才能买到票
在计算机操作系统或网路中,有各种队列在安静地工作着。打印作业在打印队列中等待打印。当敲击键盘时,也有一个存储键盘键入内容的队列,如果我们敲击了一个键,而计算机又暂时在做其他事情,敲击的内容不会丢失,它会排在队列中等待,直到计算机有时间来读取它,利用队列保证了键入内容在处理时其顺序不会改变
栈的插入和删除数据项的命名方法很标准,成为push和pop,队列的方法至今也没有一个标准化的方法,插入可以称作put、add或enque等,删除可以叫作delete、get、remove或deque等
队列示意图
随着队头元素不断地移除,数组前面空出的位置会越来越多,当队尾指针移到最后的位置时,即使队列没有满,我们也不能再插入新的数据项了,如下图:
解决这种缺点的方法是环绕式处理,即让队尾指针回到数组的第一个位置,
形成循环队列(也成为缓冲环)。虽然在存储上是线形的,但是在逻辑上它是一个首尾衔接的环形:
public class Queue {
private int[] queues;
private int maxSize;
private int front;
private int rear;
private int length;
public Queue(int maxSize) {
queues = new int[maxSize];
this.maxSize = maxSize;
this.front = 0;
this.rear = -1;
this.length = 0;
}
//插入
public void insert(int value) throws Exception {
if (isFull()){
throw new Exception("队列已满");
}
if (rear == maxSize -1){
rear = -1;
}
queues[++rear] = value;
length++;
}
//移除
public boolean remove() throws Exception {
if (isEmpty()){
throw new Exception("队列为空");
}
int elem = queues[front++];
if (front == maxSize){
front = 0;
}
length--;
return true;
}
//查看队头元素
public int peek() throws Exception {
if (isEmpty()){
throw new Exception("队列为空!");
}
return queues[front];
}
//获取队列长度
public int getSize(){
return length;
}
//判空
public boolean isEmpty(){
return (length == 0);
}
//判满
public boolean isFull(){
return (length == maxSize);
}
public void display(){
if (front < rear){
for (int i = front;i <= rear;i++){
System.out.print(queues[i]+" ");
}
System.out.print("\n");
}else {
for (int i = front;i < maxSize;i++){
System.out.print(queues[i]+" ");
}
for (int i = rear;i < front;i++){
System.out.print(queues[i]+" ");
}
}
}
}
//测试
public static void main(String[] args) throws Exception {
Queue queue = new Queue(5);
queue.insert(1);
queue.display();
queue.remove();
queue.display();
System.out.println(queue.peek());
System.out.println(queue.getSize());
queue.insert(6);
queue.display();
}
优先级队列
优先级队列有一个队头和一个队尾,并且也是从队头移除数据,从队尾插入数据,不同的是,在优先级队列中,数据项按关键字的值排序,数据项插入的时候会按照顺序插入到合适的位置。(简单来说就是按照优先级排序,插入按照优先级大小插入)。
插入图
删除图
除了可以快速访问优先级最高的数据项,优先级队列还应该可以实现相当快的插入,因此,优先级队列通常使用一种称为堆的数据结构来实现。具体实现如下: