数据结构之队列

143 阅读2分钟

队列基本思想,先进先出

1,数组模拟队列

这种实现方式有很大的缺陷:数组只能使用一次,所以下面也给出了循环队列的实现方式。

结构图

Snipaste_2021-10-30_21-25-12.png

两个变量指向点说明

Snipaste_2021-10-30_21-25-25.png

代码实现

package Queue;
public class ArrayQueueDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ArrayQueue queue = new ArrayQueue(2);
		queue.addQueeu(1);
		queue.addQueeu(2);
		//queue.addQueeu(1) 队列已满
		queue.showQueue();
		
		queue.getQueue();
		queue.getQueue();
		//queue.getQueue(); 队列为空,无法取值
		
	}

}

class ArrayQueue{
	private int maxSize;
	private int[] arr;
	private int front;
	private int rear;
	
	public ArrayQueue (int maxSize){
		this.maxSize = maxSize;
		arr = new int [maxSize];
		front = -1;
		rear = -1;
	}
	
	//判断是否为空
	public Boolean isEmpty() {
		return front == rear;
	}
	
	//判断是否满了
	public Boolean isFull() {
		return rear == maxSize-1;
	}
	//入队
	public void addQueeu(int n) {
		if(isFull()) {
			throw new RuntimeException("队列已满");
		}
		rear++;
		arr[rear] = n;
	}
	//出队
	public int getQueue() {
		if(isEmpty()) {
			throw new RuntimeException("队列为空,无法取值");
		}
		front++;
		return arr[front];
	}
	//显示所有数据
	public void showQueue() {
		if(isEmpty()) {
			return;
		}
		for(int i=0; i<arr.length; i++) {
			System.out.printf("arr[%d]=%d\n",i,arr[i]);
		}
	}
	
}

2,环形数组模拟队列

图结构说明

Snipaste_2021-10-31_12-08-35.png

解释说明: front前面的一个位置是为空的(front移动空位也就跟着移动),假设数组大小为4,那么实际就只能存3个数据。 留一个空位是为了给判空和判满这两个条件做区分的。

代码实现如下

package Queue;

public class CircleArrayQueueDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		CirleQueue c = new CirleQueue(3);
		
		System.out.println(c.isEmpty());//true
		
		c.addQueeu(1);
		c.addQueeu(2);
		//c.addQueeu(3);队列已满
		
		System.out.println(c.isFull());//true
		
		c.showQueue();
		
		System.out.println(c.getQueue());
		
		c.addQueeu(3);
		c.showQueue();
		
		System.out.println(c.isFull());//true

	}

}

class CirleQueue{
	private int maxSize;
	private int[] arr;
	//默认为0,所有不用初始化
	private int front;
	private int rear;
	
	public CirleQueue (int maxSize){
		this.maxSize = maxSize;
		arr = new int [maxSize];
	}
	
	//判断是否为空
	public Boolean isEmpty() {
		return front == rear;
	}
	
	//判断是否满了
	public Boolean isFull() {
		//以front为0,rear为maxSize-1为例,需要空一个位置
		return (rear+1)%maxSize == front;
	}
	//入队
	public void addQueeu(int n) {
		if(isFull()) {
			throw new RuntimeException("队列已满");
		}
		arr[rear] = n;
		rear = (rear+1)%maxSize;
	}
	//出队
	public int getQueue() {
		if(isEmpty()) {
			throw new RuntimeException("队列为空,无法取值");
		}
		//front指向队列的第一个元素
		int value = arr[front];
		front = (front+1)%maxSize;
		return value;
	}
	
	public void showQueue() {
		if(isEmpty()) {
			return;
		}
		for(int i=front; i<front+size(); i++) {
			System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]);
		}
	}
	
	//获取队列大小
	public int size() {
		return (rear+maxSize-front)%maxSize;
	}
	
}