队列有两种实现方式:静态队列(数组)和动态队列(链表)。算法
此次我就使用数组来实现静态队列了。值得注意的是:每每实现静态队列,咱们都是作成循环队列。数组
package com.darrenchan; public class MyQueue { public int[] arrays; public int front;//指向第一个有效元素 public int rear;//指向最后一个有效元素的下一个元素(无效元素) public MyQueue(int[] arrays, int front, int rear) { this.arrays = arrays; this.front = front; this.rear = rear; } /** * 判断队列是否满了 * @param myQueue * @return */ public static boolean isFull(MyQueue myQueue){ if((myQueue.rear + 1) % myQueue.arrays.length == myQueue.front){ return true; }else{ return false; } } /** * 判断是否为空 * @param myQueue * @return */ public static boolean isEmpty(MyQueue myQueue){ if(myQueue.rear == myQueue.front){ return true; }else{ return false; } } /** * 入队 * @param myQueue * @param value */ public static void enQueue(MyQueue myQueue, int value){ //不是满的队列才入队 if(!isFull(myQueue)){ myQueue.arrays[myQueue.rear] = value; myQueue.rear = (myQueue.rear + 1) % myQueue.arrays.length; } } /** * 遍历 * @param myQueue */ public static void traverse(MyQueue myQueue){ int i = myQueue.front; while(i != myQueue.rear){ System.out.print(myQueue.arrays[i] + " "); i = (i + 1) % myQueue.arrays.length; } System.out.println(); } public static void outQueue(MyQueue myQueue){ if(!isEmpty(myQueue)){ int value = myQueue.arrays[myQueue.front]; System.out.println(value); myQueue.front = (myQueue.front + 1) % myQueue.arrays.length; } } public static void main(String[] args) { MyQueue myQueue = new MyQueue(new int[6], 0, 0); System.out.println(isEmpty(myQueue)); enQueue(myQueue, 1); enQueue(myQueue, 2); enQueue(myQueue, 3); enQueue(myQueue, 4); enQueue(myQueue, 5); System.out.println(isFull(myQueue)); traverse(myQueue); outQueue(myQueue); } }
从上面的设计咱们能够发现:rear并不指向最后一个有效的元素,在循环队列中这样设计是很是方便的!由于这样设计能够让咱们分得清队头和队尾(否则循环队列不断入队或出队,位置是变化很快的)this
因为咱们是循环队列,因此front
和rear
值会常常变更,咱们得把front
和rear
的值限定在一个范围内,否则会超出队列的长度的。spa
有这么一个算法:rear=(rear+1)%数组长度
设计
rear = (rear+1) % 6
,结果仍是3