JAVA基础(66)---队列

队列

是一种先进先出(FIFO)的线性表,只能在表的一端(队尾)进行插入,在另一端(队头)进行删除运算的线性表。

逻辑结构:与线性表相同,仍为一对一关系

存储结构:用顺序队列或链队存储均可

运算规则:先进先出(FIFO)

实现方式:关键是编写入队和出队的函数,具体实现 依顺序对或链队的不同而不同

实现

线性表有顺序存储和链式存储,队列是一种特殊的线性表,同样也存在这两种存储方式。

解决假溢出:顺序循环队列

如何判断循环队列究竟是空的还是满的

现在问题又来了,我们之前说,空队列时,front指针等于rear指针,那么现在循环队列满的时候,也是front等于rear,那么如何判断循环队列究竟是空的还是满的?有如下办法:

办法1:设置一个标志位flag。初始时置flag=0;每当入队列操作成功就置flag=1;每当出队列操作成功就置flag=0。则队列空的判断条件为:rear == front && flag==0;队列满的判断条件为:rear = = front && flag= =1。

办法2:保留一个元素的存储空间。此时,队列满时的判断条件为  (rear + 1) % maxSize == front;队列空的判断条件还是front == rear。

办法3:设计一个计数器count,统计队列中的元素个数。此时,队列满的判断条件为:count > 0 && rear == front ;队列空的判断条件为count == 0。    

队列的常用操作

入队、出队(返回队首元素并且删除队首元素)、判断队列是否已满、判断队列是否为空、获取队首元素(只是获取队首元素,但不删除)

实现代码

package org.lanqiao.queue;
/*
 * 接口:针对队列操作的规范
 */
public interface IQueue {
	/*
	 * 入队
	 */
	public void inputQueue(Object obj);
	/*
	 * 出队
	 */
	public Object outputQueue();
	/*
	 * 判断队列是否已满
	 */
	public boolean isMax();
	/*
	 * 判断队列是否为空
	 */
	public  boolean isEmpty();
	/*
	 * 获取队首元素
	 */
	public Object getQueueFront();
}
package org.lanqiao.queue;

public class Queue  implements IQueue{

	private int front = 0 ;//队首标记
	private int rear = 0;//队尾标记
	private int size = 0;//队列中元素的个数
	private Object[] que;//队列的底层本质
	private int capacity = 10;//队列的默认容量
	public Queue() {
		que = new Object[capacity];
		
	}
	public Queue(int capacity) {
		que = new Object[capacity];
		this.capacity = capacity;
		
	}
	@Override
	public void inputQueue(Object obj) {
		//判断队列是否已满
		if(isMax()) {
			
			System.out.println("队列已满");
			return;
		}
		rear = (rear + 1)%capacity;
		if(rear == 0) {
			rear = 1;
		}
		que[rear] = obj;

		size++;
		
	}

	@Override
	public Object outputQueue() {
		if(!isEmpty()) {
			
			front = (front + 1 )%capacity;
			if(front==0) {
				front = 1;
			}
			size--;
			return que[front];
			
		}
		System.out.println("队列为空");
		return null;
		
	}
	/*
	 * 办法2:保留一个元素的存储空间。
	 * 此时,队列满时的判断条件为  ( rear + 1) % maxSize == front;
	 * 队列空的判断条件还是front == rear
	 */
	@Override
	public boolean isMax() {
		return (size + 1) == capacity;
	}

	@Override
	public boolean isEmpty() {
		
		return front == rear;
	}

	@Override
	public Object getQueueFront() {
		
		return que[front + 1];
	}
	
	public void print() {
		for(int i = 1 ; i <capacity; i++) {
			System.out.println(que[i]);
			
		}
		
	}
}
package org.lanqiao.queue;

public class Test {
	public static void main(String[] args) {
		Queue q = new Queue(5);
		q.inputQueue("1");
		q.inputQueue("2");
		q.inputQueue("3");
		q.inputQueue("4");
		q.inputQueue("5");
		q.print();
		System.out.println("---------------");
		System.out.println(q.outputQueue());
		System.out.println(q.outputQueue());
		System.out.println(q.getQueueFront());
		q.inputQueue("5");
		q.inputQueue("6");
		System.out.println("---------------");
		q.print();
		System.out.println(q.getQueueFront());
		
	}
}

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值