赞
踩
队列(queue)是一种线性的数据结构,只允许在表的一端进行插入操作而在另一端进行删除的线性表。进行删除操作的一端称为队头,进行插入操作的端称为队尾。
顺序队列,用一片连续的存储空间来存储队列中的数据元素,所以一般用数组来实现顺序队列。一般队头用front来指示,指向刚出队的元素的位置;队尾用rear指示,指向刚进队的元素位置。
由于队列在队尾就"进元素”,在队头“出元素”,即先进先出(first in first out)的特性,使得队列会出现rear指向了队列最大长度的位置,再插入一个元素就会导致溢出,但实际上队列却没有满,这种情况成为 “假溢出”。解决假溢出的方法是将顺序队列看成是首尾相接的循环结构,但首尾指示器的关系不变,这种队列叫循环队列,循环队列是改进的顺序队列。
下面是一个长度为8的循环队列的进队/出队示意图:
(1)由空队进入两个元素,此时front指向0,rear指向2.
(2)进队4个元素,出队3个元素,此时front指向3,rear指向6.
(3)进队2个元素,出队4个元素,此时front指向7,rear指向0.
从上图可以看出,经过进出操作,rear和front都指向了数组尾端,依然可以让元素继续入队。
public class QueueA { private int maxSize; //队列的容量 private int[] queue; private int data;//队列的数据类型,在本例中为int型。 private int front;//指向刚出队的元素的位置 private int rear;//指向刚进队的元素位置 //初始化顺序队列操作 public void initQueue() { this.maxSize = 10; this.front = 0; this.rear = 0; this.queue = new int[maxSize]; } //入队列操作 public void enQueue(int x) { if(!judgeFull()) { rear = (rear+1)%maxSize; queue[rear] = x; } } //出队列操作,返回出队列元素 public int deQueue() { if(!judgeEmpty()) { front = (front+1)%maxSize; int result = queue[front]; } return result ; } //判队列是否已满 public boolean judgeFull() { if ((rear+1)%maxSize==front) return true; else return false; } //判队列是否为空 public boolean judgeEmpty() { if (rear==front) { return true; } else { return false; } } public static void main(String[] args) { QueueA q = new QueueA(); q.initQueue(); for(int i = 0;i<20;i++) { q.enQueue(i); System.out.println("结果是:"+q.deQueue()+"rear下标:"+q.rear); } } }
运行结果如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。