定义
队列(queue)是一种特殊的线性表,它只允许在表的前端进行删除,在表的后端进行插入。
进行插入端的称为队尾,进行删除端的称为队头。队列是先进先出原则的。队列的实现同样可以
使用两种方式来实现,一种是数的实现方式,另一种是链表的实现方式。
队列的实现
我们已经知道队列已经有两种方式实现,虽然底层的实现方式不同,但是其具有的方法是相同
的,我们采用接口定义其具有的操作。
[java] view plain copy
- package com.kiritor;
- /**
- * 队列FIFO的接口
- * @author Kiritor
- * */
- public interface Queue<T> {
- /**
- * 入队:从队尾加入一个元素
- * @param t
- * */
- void add(T t);
- /**
- * 出队:移走队头元素并返回
- * @return 当前队头元素*/
- T remove();
- /**
- * 当前队列的元素个数*/
- int size();
- /**
- * 判断当前队列是否为空
- * @return */
- boolean isEmpty();
- /**
- * 只是返回队头元素,并未删掉
- * @return t*/
- T front();
- }
队列的数组实现
[java] view plain copy
- package com.kiritor;
- import java.util.Arrays;
- /**
- * 基于数组实现的队列
- * @author Kiritor*/
- public class ArrayQueue<T> implements Queue<T>{
- private T[] data;
- private int size;//元素个数
- private int front;//队列中第一个对象的位置
- private int rear;//队列中当前对象的位置
- public ArrayQueue() {
- data = (T[]) new Object[10];
- size = 0;
- front =0;
- rear = 0;
- }
- @Override
- public void add(T t) {
- if(isFull())
- {
- resize();
- front = 0;
- }
- rear = (front+size)%data.length;
- System.out.println(rear);
- data[rear] = t;
- size++;
- }
- @Override
- public T remove() {
- if (isEmpty()) {
- throw new RuntimeException("队列为空!");
- }
- T tempData = data[front];
- data[front] = null;
- //思考一下这里有必要进行除法运算吗?
- front = (front + 1) % (data.length);
- size--;
- return tempData;
- }
- @Override
- public int size() {
- return size;
- }
- @Override
- public boolean isEmpty() {
- return size == 0;
- }
- @Override
- public T front() {
- if (isEmpty()) {
- throw new RuntimeException("队列为空!");
- }
- return data[front];
- }
- /**
- * 判断当前队列是否已满
- * @return*/
- public boolean isFull()
- {
- return size == data.length;
- }
- /**
- * 扩容,2倍
- * */
- public void resize()
- {
- /*注意重新扩容的时候并不需要去设置size
- * 队列的大小并不能通过数组的大小直观的显示出来。
- * 但是栈就可以直观的通过数组的大小显示出来*/
- T[] tmp = (T[]) new Object[data.length*2];
- System.arraycopy(data, 0, tmp, 0, data.length);
- data = tmp;
- tmp = null;//引用置为空,便于gc处理
- }
- public static void main(String[] args) {
- ArrayQueue<String> q = new ArrayQueue<String>();
- q.add("a");
- q.add("b");
- q.add("c");
- q.add("d");
- q.add("e");
- q.add("f");
- q.add("g");
- q.add("h");
- q.add("i");
- q.add("j");
- q.add("k");
- q.add("l");
- q.add("m");
- while( !q.isEmpty() ){
- String temp = q.remove();
- System.out.println(temp);
- }
- }
- }
队列的链表实现
[java] view plain copy
- package com.kiritor;
- /**
- * 队列的链表实现
- * @author Kiritor
- * @param <T>*/
- public class LinkQueue<T> implements Queue<T> {
- private Node head;
- private Node rear;
- private int size;
- public LinkQueue() {
- head = null;
- rear = null;
- size = 0;
- }
- class Node
- {
- T data;
- Node next;
- public Node() {
- //无参构造
- }
- public Node(T t)
- {
- this.data = t;
- }
- }
- /**
- * 从队列的尾部插入结点*/
- @Override
- public void add(T t) {
- Node node = new Node(t);
- /*如果是队列则头部和尾部都执行Node*/
- if(isEmpty())
- head = node;
- else
- rear.next = node;
- rear = node;
- size++;//队列长度+1
- }
- /**
- * 从队列的头部删除
- * @return T*/
- @Override
- public T remove() {
- T tmp;
- if(isEmpty()){
- new NullPointerException("队列是空的!");
- tmp = null;
- }
- else
- {
- if(null==head.next )
- rear = null;
- tmp = head.data;
- head = head.next;
- size--;
- }
- return tmp;
- }
- @Override
- public int size() {
- return size;
- }
- @Override
- public boolean isEmpty() {
- return head == null;
- }
- /**
- * 查看队列头部,不做任何处理*/
- @Override
- public T front() {
- if(head !=null)
- return head.data;
- return null;
- }
- public static void main(String[] args) {
- LinkQueue<String> q = new LinkQueue<String>();
- q.add("a");
- q.add("b");
- q.add("c");
- q.add("d");
- q.add("e");
- q.add("f");
- q.add("g");
- q.add("h");
- q.add("i");
- q.add("j");
- q.add("k");
- q.add("l");
- q.add("m");
- System.out.println(q.size);
- while( !q.isEmpty() ){
- String temp = q.remove();
- System.out.println(temp);
- System.out.println(q.size());
- }
- }
- }
看下链队列的演示操作吧
时间: 2024-12-07 04:55:38