Queue based on data structure (java implementation)

This article has participated in the "Newcomer Creation Ceremony" activity, and started the road of Nuggets creation together

1. A queue is an ordered list, which can be implemented with an array or a linked list

2. First in first out

image.png

front points to the head of the queue, rear points to the tail of the queue, and maxsize is the maximum capacity of the queue

Queue implementation:

(1) First use the array to simulate the queue - write an array queue class, the values ​​are:

    private int maxSize; // Indicates the maximum capacity of the array
private int front; // Queue head
private int rear; // Queue tail
private int[] arr; // This data is used to store data, simulating queue

(2) Then create the constructor

    maxSize = arrMaxSize;
arr = new int[maxSize];

    front = -1; // Points to the head of the queue, and analyzes that front is the previous position pointing to the head of the queue. The front after front++ is the first-out data
rear = -1; // Points to the end of the queue, points to the data at the end of the queue ( That is, the last data in the queue), then rear after rear++ is the subscript of the backward data

(3) Then judge the condition of the team being empty

When front==rear (the head of the queue is equal to the tail of the queue)

(4) Conditions for judging that the team is full

When rear==maxsize-1 (the tail of the queue is equal to the maximum subscript -1, why -1 is because the subscript starts from 0)

(5) Start adding queues

First judge whether the queue is full (4), start adding the queue if the queue is not full

rear++; (why to add, because there is data into the queue rear to move back one place)

arr[rear]= n;(n is the value added to the queue)

(6) out of the queue

front++; (why add it, because there is data out of the queue, the front points to the previous position of the queue head, so it needs to move one bit back to point to the advanced data)

return arr[front];

Below is the code implemented in java

package com.atguigu.queue;

import java.util.Scanner;

public class ArrayQueueDemo {

	public static void main(String[] args) {
		//测试一把
		//创建一个队列
		ArrayQueue queue = new ArrayQueue(3);
		char key = ' '; //接收用户输入
		Scanner scanner = new Scanner(System.in);//
		boolean loop = true;
		//输出一个菜单
		while(loop) {
			System.out.println("s(show): 显示队列");
			System.out.println("e(exit): 退出程序");
			System.out.println("a(add): 添加数据到队列");
			System.out.println("g(get): 从队列取出数据");
			System.out.println("h(head): 查看队列头的数据");
			key = scanner.next().charAt(0);//接收一个字符
			switch (key) {
			case 's':
				queue.showQueue();
				break;
			case 'a':
				System.out.println("输出一个数");
				int value = scanner.nextInt();
				queue.addQueue(value);
				break;
			case 'g': //取出数据
				try {
					int res = queue.getQueue();
					System.out.printf("取出的数据是%d\n", res);
				} catch (Exception e) {
					// TODO: handle exception
					System.out.println(e.getMessage());
				}
				break;
			case 'h': //查看队列头的数据
				try {
					int res = queue.headQueue();
					System.out.printf("队列头的数据是%d\n", res);
				} catch (Exception e) {
					// TODO: handle exception
					System.out.println(e.getMessage());
				}
				break;
			case 'e': //退出
				scanner.close();
				loop = false;
				break;
			default:
				break;
			}
		}
		
		System.out.println("程序退出~~");
	}

}

// 使用数组模拟队列-编写一个ArrayQueue类
class ArrayQueue {
	private int maxSize; // 表示数组的最大容量
	private int front; // 队列头
	private int rear; // 队列尾
	private int[] arr; // 该数据用于存放数据, 模拟队列

	// 创建队列的构造器
	public ArrayQueue(int arrMaxSize) {
		maxSize = arrMaxSize;
		arr = new int[maxSize];
		front = -1; // 指向队列头部,分析出front是指向队列头的前一个位置.
		rear = -1; // 指向队列尾,指向队列尾的数据(即就是队列最后一个数据)
	}

	// 判断队列是否满
	public boolean isFull() {
		return rear == maxSize - 1;
	}

	// 判断队列是否为空
	public boolean isEmpty() {
	
		return rear == front;
	}

	// 添加数据到队列
	public void addQueue(int n) {
		// 判断队列是否满
		if (isFull()) {
			System.out.println("队列满,不能加入数据~");
			return;
		}
		rear++; // 让rear 后移
		arr[rear] = n;
	}

	// 获取队列的数据, 出队列
	public int getQueue() {
		// 判断队列是否空
		if (isEmpty()) {
			// 通过抛出异常
		
			throw new RuntimeException("队列空,不能取数据");
		}
		front++; // front后移
		return arr[front];

	}

	// 显示队列的所有数据
	public void showQueue() {
		// 遍历
		if (isEmpty()) {
		
			System.out.println("队列空的,没有数据~~");
			return;
		}
		for (int i = 0; i < arr.length; i++) {
			System.out.printf("arr[%d]=%d\n", i, arr[i]);
		}
	}

	// 显示队列的头数据, 注意不是取出数据
	public int headQueue() {
		// 判断
		if (isEmpty()) {
		
			throw new RuntimeException("队列空的,没有数据~~");
		}
		return arr[front + 1];
	}
}

复制代码

Guess you like

Origin juejin.im/post/7085630087453736968