队列的操作
package com.xuda.queue;
/**
* 队列的操作
* 入队 addQueue
* 步骤:添加数据将尾指针后移:rear+ 1,当front == rear时队列为空
* 若尾指针rear小于队列的最大下标maxSize-1时,则将数据存入rear所指的数组元素中,否则无法存入数据,rear==maxSize -1时,队列满
* 注意:front指向的是队列首元素的前一个位置
* 出队
* 队头
* 队尾
*/
public class DemoQueue {
public static void main(String[] args) {
ArrayQueue arrayQueue = new ArrayQueue(5);
arrayQueue.addNum(10);
arrayQueue.addNum(20);
// System.out.println(arrayQueue.getNum());
//System.out.println(arrayQueue.isEmpty());
// arrayQueue.showQueue();
// arrayQueue.addNum(30);
arrayQueue.addNum(40);
arrayQueue.addNum(50);
// System.out.println(arrayQueue.getNum());
arrayQueue.showQueue();
}
}
//创建队列
class ArrayQueue {
//队列大小
int maxSize;
//用数组来实现队列
int[] arr; //存放数据
//指向队列首元素的前一个位值
int front;
//指向队列尾元素
int rear;
//构造初始化数据结构
public ArrayQueue(int maxSize) {
this.maxSize = maxSize;
arr = new int[this.maxSize];
//front指向队列首元素的前一个位置
front = -1;
rear = -1;
}
//创建方法
/**
* 判断是否队列已满
* @return boolean
*/
public boolean isFull() {
return rear == maxSize - 1;
}
/**
* 判断队列是否为空
* @return boolean
*/
public boolean isEmpty() {
return front == rear;
}
public void addNum(int num) {
if (isFull()) {
System.out.println("队列已满,无法进行入队操作!");
return;
}
//队尾标记后移,指向要放入的元素的位置
rear++;
arr[rear] = num;
}
/**
* 元素出队
* @return number
*/
public int getNum() {
if (isEmpty()) {
throw new RuntimeException("队列为空,无法出队");
}
//队首标记后移,指向队首元素
System.out.println("出队元素是:");
front++;
return arr[front];
}
public void showQueue() {
if (isEmpty()) {
throw new RuntimeException("队列为空,无法遍历");
}
System.out.println("遍历队列");
for (int start = front + 1; start <= rear; start++) {
System.out.println(arr[start]);
}
}
}
循环队列操作步骤
package com.xuda.queue;
/**
* 环形队列的练习
* :思路
* front变量指向队首元素,初值为0
* rear变量指向队列尾元素的下一个元素,初值为0,规定空出一个位置
* 队列为空的判定条件:front == rear
* 队列为满的判定条件:(rear + 1)%maxSize == front
* 队列中有效元素的个数:(rear - front + maxSize) % maxSize
* 入队和出队时,都需要让标记对maxSize取模
*/
public class circlequeue {
public static void main(String[] args) {
Queue queue = new Queue(6);
queue.addNum(10);
queue.addNum(20);
queue.addNum(30);
queue.addNum(40);
queue.addNum(50);
queue.showQueue();
System.out.println(queue.getNum());
System.out.println(queue.getNum());
queue.showQueue();
}
}
//创建队列
class Queue {
//队列大小
int maxSize;
//用数组来实现队列
int[] arr; //存放数据
//指向队列首元素的前一个位值
int front;
//指向队列尾元素
int rear;
//构造初始化数据结构
public Queue(int maxSize) {
this.maxSize = maxSize;
arr = new int[this.maxSize];
//front指向队列首元素的前一个位置
front = 0;
rear = 0;
}
//创建方法
/**
* 判断是否队列已满
*
* @return boolean
*/
public boolean isFull() {
return (rear + 1)%maxSize == front;
}
/**
* 判断队列是否为空
*
* @return boolean
*/
public boolean isEmpty() {
return front == rear;
}
public void addNum(int num) {
if (isFull()) {
System.out.println("队列已经满了,无法操作");
return;
}
//先放入元素,在后移队尾标记
arr[rear] = num;
rear = (rear + 1) %maxSize;
}
public int getNum() {
if (isEmpty()) {
throw new RuntimeException("队列为空无法取出");
}
//队首标记后移,指向队首元素
System.out.println("出队元素是:");
int num = arr[front];
front = (front +1) % maxSize;
return num;
}
public void showQueue() {
if (isEmpty()) {
throw new RuntimeException("队列为空,无法操作");
}
System.out.println("遍历队列");
int start = front;
while(start != rear) {
System.out.println(arr[start]);
//移动到下一个元素
start = (start + 1)%maxSize;
}
}
public void getHead() {
if (isEmpty()) {
throw new RuntimeException("队列为空");
}
System.out.println("队首元素为:" + arr[front]);
}
}