环形队列

来源:互联网 发布:服务器批量安装linux 编辑:程序博客网 时间:2024/04/29 02:15

方法一:

         为了能够充分地使用数组中的存储空间,把数组的前端和后端连接起来,形成一个环形的顺序表,即把存储队列元素的表从逻辑上看成一个环,称为环形队列,也叫循环队列。

ps:1、队空条件:front==rear

        2、队满条件:(rear+1)%maxSize == front   //少用一个空间,即最多放maxSize-1个元素。

        3、初始化时front=rear=0;且从data[1]开始放元素。

        4、队中元素个数为(rear-front+maxSize)%maxSize

        5、队首指针进1:front=(front+1)%maxSize

              队尾指针进1:rear=(rear+1)%maxSize


public class SqQueue {int[] data;int front, rear;SqQueue() {data = new int[30];front = rear = 0;}boolean empty() {return front == rear;}boolean enQueue(int e) {if((rear+1)%30 == front)return false;rear=(rear+1)%30;data[rear] = e;return true;}int[] deQueue() {int[] arr = new int[2];if(front == rear) {arr[0] = 0;return arr;}arr[0] = 1;front=(front+1)%30;arr[1] = data[front];return arr;}void display() {int count = (rear-front+30)%30;for(int i=0; i<=count-1; i++) {if(i != count-1) {System.out.print(data[(i+front+1)%30] + "->");} else {System.out.println(data[(i+front+1)%30]);}}}public static void main(String[] args) {SqQueue sq = new SqQueue();System.out.println(sq.empty());sq.enQueue(4);sq.enQueue(5);sq.display();sq.deQueue();sq.deQueue();System.out.println(sq.empty());sq.display();sq.enQueue(1);sq.enQueue(3);sq.display();sq.deQueue();sq.display();sq.enQueue(2);sq.deQueue();sq.display();System.out.println(sq.empty());}}


方法二:

        如果知道了队头指针和队列中的元素个数,就可以计算出队尾指针。

ps: 1、rear = (front+count)%maxSize

         2、队空条件 count==0,队满条件 count == maxSize

         3、与方法一的区别是该队列最多可以放置maxSize个元素。

         4、初始化时front=0,count=0


public class SqQueue {int[] data;int front, count;SqQueue() {data = new int[30];front = count = 0;}boolean empty() {return count==0;}boolean enQueue(int e) {if(count==30)return false;int rear = (front+count)%30;rear=(rear+1)%30;data[rear] = e;count++;return true;}int[] deQueue() {int[] arr = new int[2];if(count == 0) {arr[0] = 0;return arr;}arr[0] = 1;front=(front+1)%30;arr[1] = data[front];count--;return arr;}void display() {for(int i=0; i<=count-1; i++) {if(i != count-1) {System.out.print(data[(i+front+1)%30] + "->");} else {System.out.println(data[(i+front+1)%30]);}}}public static void main(String[] args) {SqQueue sq = new SqQueue();System.out.println(sq.empty());sq.enQueue(4);sq.enQueue(5);sq.display();sq.deQueue();sq.deQueue();System.out.println(sq.empty());sq.display();sq.enQueue(1);sq.enQueue(3);sq.display();sq.deQueue();sq.display();sq.enQueue(2);sq.deQueue();sq.display();System.out.println(sq.empty());}}

结果都是:

true4->5true1->332false



0 0
原创粉丝点击