实现思路:
- front 表示指向队列第一个元素,初始化为0。
- rear 表示指向队列最后一个元素的后一个位置,初始化为0。
- 数组实现环形队列需要预留一个空位置(不放元素)。
- 当队列已满时,满足:
(rear + 1) % capacity == front
- 当队列为空时,满足:
(rear + capacity - front) % capacity == 0
- 当出队列时,front变化满足
front = (front + 1) % capacity
- 队列元素个数等于
(rear + capacity - front) % capacity
完整代码
public class CircleArray { private int front; private int rear; private int capacity; int []queue; //构造器 public CircleArray(){ front = 0; rear = 0; capacity = 10; queue = new int[capacity]; } public CircleArray(int capacity){ front = 0; rear = 0; this.capacity = capacity; queue = new int[capacity]; } //判断队列是否已满 public boolean isFull(){ return (rear + 1) % capacity == front; } //判空 public boolean isEmpty(){ return (rear + capacity - front) % capacity == 0; } //入队列 public void queueAdd(int x){ if(isFull()){ throw new RuntimeException("队列已满,不能入队列!"); } queue[rear] = x; //会空一个位置 rear = (rear + 1) % capacity; } //取数据 public int queueFront(){ if(isEmpty()){ throw new RuntimeException("队列为空,无法取数据!"); } return queue[front]; } //出队列 public int queuePop(){ if(isEmpty()){ throw new RuntimeException("队列为空,不能出队列!"); } int value = queue[front]; front = (front + 1) % capacity; return value; } //获取队列有效数据的个数 public int queueSize(){ return (rear + capacity - front) % capacity; } //显示队列数据 public void showQueue(){ if(isEmpty()){ throw new RuntimeException("队列为空,无法显示数据!"); } int tmp = front; for(int i = 0; i < queueSize(); i++){ System.out.print(queue[tmp] + " "); tmp = (tmp + 1) % capacity; } } }
代码测试
测试代码:
class Test01{ public static void main(String[] args) { CircleArray c = new CircleArray(5); System.out.println("a:isFull"); System.out.println("b:isEmpty"); System.out.println("c:queueAdd"); System.out.println("d:queueFront"); System.out.println("e:queuePop"); System.out.println("f:queueSize"); System.out.println("g:showQueue"); Scanner scanner = new Scanner(System.in); while(true){ char k = scanner.next().charAt(0); switch(k){ case 'a': System.out.println(c.isFull()); break; case 'b': System.out.println(c.isEmpty()); break; case 'c': try{ c.queueAdd(scanner.nextInt()); }catch(RuntimeException e){ System.out.println(e.getMessage()); } break; case 'd': try{ System.out.println("对头数据为:" + c.queueFront()); }catch(RuntimeException e){ System.out.println(e.getMessage()); } break; case 'e': try{ System.out.println(c.queuePop() + "已被出队列!"); }catch(RuntimeException e){ System.out.println(e.getMessage()); } break; case 'f': System.out.println(c.queueSize()); break; case 'g': try{ c.showQueue(); }catch(RuntimeException e){ System.out.println(e.getMessage()); } break; default: break; } } } }