Java数据结构(二):队列

版权声明:转载请注明原文地址。 https://blog.csdn.net/qq_39240270/article/details/86766529

队列的简单介绍:

       队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
       队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表
数据结构中的队列长这个样:
在这里插入图片描述

  • 例如窗口排队时,先到的人先买票。

队列的数组实现(静态队列)

       往往实现静态队列,我们都是做成循环队列,这样的好处不浪费内存资源!
在这里插入图片描述
       在设计尾指针rear的时候,并不指向最后一个有效的元素,在循环队列中这样设计是很方便的!因为这样设计可以让我们分得清队头和队尾。
       为了防止假溢出,使用front=front%sizerear=(rear+1)%size算法。

public class ArrayQueue {
	private int a[];
	private int size;//队列的最大容量
	private int nItems;//队列中实际数据的数量
	private int front;//头指针
	private int rear;//尾指针
	
	public ArrayQueue() {
		this(10);//未设定最大容量时,默认最大容量是10
	}

	//初始化
	public ArrayQueue(int maxSize) {
		this.a = new int[maxSize];
		this.size = maxSize;
		this.nItems = 0;
		this.front = 0;
		this.rear = 0;
	}
	
	//入队
	public boolean push(int data) {
		//判断队列是否已满
		if(isFull()) {
			System.out.println("队列已满!");
			return false;
		}
		a[rear % size] = data;
		rear = (rear + 1) % size;
		nItems ++;
		return true;
	}
	
	//出队
	public int pop() {
		//判断队列是否为空
		if(isEmpty()) {
			System.out.println("队列为空!");
			return -1;
		}
		
		front = front % size;
		nItems --;
		return a[front--];
	}
	
	//遍历队列
	public void traverseQueue() {
		for(int i = 0;i < nItems;i++ ) {
			System.out.println(a[i]);
		}
	}
	
	//得到队列的数据的个数
	public int size() {
		return nItems;
	}
	
	//判断队列是否为空
	public boolean isEmpty() {
		return nItems == 0;
	}
	
	//判断队列是否已满
	public boolean isFull() {
		return nItems == size;
	}
}

队列的链表实现

public class LinkedQueue {
	private Node front;//定义头结点
	private Node rear;//定义尾节点
	private int size;//队列中数据的数目
	
	//初始化
	public LinkedQueue() {
		this.front = null;
		this.rear = null;
		this.size = 0;
	}
	
	//入队
	public void add(int data) {
		Node node= new Node(data);
		if(front == null) {
			front = rear = node;
		}
		//插入尾巴
		rear.next = node;
		//将尾指针指向新的节点
		rear = node;
		size ++;
	}
	
	//出队
	public int out() {
		//判断队列是否为空
		if(size == 0) {
			System.out.println("队列为空!");
			return -1;
		}
		int i = front.data;
		front = front.next;
		size --;
		return i;
	}
	
	//遍历队列
	public void traverseQueue() {
		//定义一个新节点用于遍历
		Node currentNode = front; 
		while(currentNode != null) {
			System.out.println(currentNode.data);
			currentNode = currentNode.next;
		}
	}
	
	//得到队列的长度
	public int size() {
		return size;
	}
}
//定义节点
class Node {
	//用public声明方便存取
	//数据域
	public int data;
	//指向下一个节点
	public Node next;
	
	public Node(int data) {
		this.data = data;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_39240270/article/details/86766529