数据结构之队列的基本实现


队列

队列和栈一样都是一种特殊的线性表。队列的基本操作是入队,它是在队列尾部插入一个元素,和出队,删除并返回在队列头部的元素。因为在队列尾插入,在队列头删除,所以队列的工作模式是先进先出,与栈(先进后出)是相反的。下图为队列的基本结构图。
在这里插入图片描述

队列的实现

和栈一样,队列也可以通过数组和链表来实现。上一篇栈是使用链表来实现的,这里队列就用数组来实现。使用数组实现队列往往是做成循环队列,不浪费资源。

属性及构造方法

实现队列的方法之前,还需要定义基本的队列属性和构造方法。

  • 因为基于数组实现,所以定义数组肯定是必不可少的。
  • 定义两个指针头指针、尾指针,分别指向队列头和队列尾的下标。
  • 定义一个size属性来统计队列中数据的个数。
  • 定义一个arrLen来保存队列数组的长度,默认队列数组长度为10。
  • 无参构造方法,队列数组默认长度为10。
  • 指定队列长度的构造方法。

代码部分

//队列数组
public Object[] arr;
//头指针
public int front = 0;
//尾指针
public int rear = 0;
//队列中元素个数
public int size = 0;
//队列数组长度默认为10
public int arrLen = 10;

//构造方法
public StrQueue() {
    //无参构造方法,队列数组默认长度设置为10
    arr = new Object[arrLen];
}

//指定队列长度的构造方法
public StrQueue(int arrLen) {
    this.arrLen = arrLen;
    arr = new Object[arrLen];
}

isEmpty()方法

isEmpty()方法判断队列是否为空,如果队列中元素的数量等于0即队列为空。

public Boolean isEmpty(){
   	return size == 0;
}

getSize()方法

getSize()方法返回队列中元素数量,在属性中定义了一个队列元素数量的属性size,所以这里直接返回size属性即可。

public Integer getSize(){
    return size;
}

isFull()方法

isFull()方法,判断队列是否已满,队列头和队列尾相等,即队列已满。

public Boolean isFull(){
    //队列头和队列尾相等,即队列已满
    return (rear + 1) % arrLen == front;
}

traverse()方法

traverse()方法遍历队列,只有队列头结点和尾结点不相等,就可以一直输出。

代码实现

public void traverse(){
    //先找到队列头,从队列头部开始遍历
    int i = front;
    while (i != rear){
        System.out.println("编程小马:" + arr[i]);
        //移动队列头
        i = (i + 1) % arrLen;
    }
}

add(Object data)方法

add(Object data)方法入队,即添加元素到队列。入队之前需要先判断一下队列是否已满;在队列尾插入元素,即直接在队列尾指针位置插入,改变尾指针的位置即可。

代码实现

/**
 * 添加元素到队列,队列添加元素都是添加在队列尾部
 * @param data 添加的元素值
 * @return Boolean
 */
public Boolean add(Object data){
    //判断队列是否满了
    if(isFull()){
        System.out.println("队列已满!无法添加");
        return false;
    }
    //添加元素到队列
    arr[rear] = data;
    //改变尾指针位置
    rear = (rear+1) % arrLen;
    //队列元素个数自增
    size++;
    return true;
}

入队测试
在这里插入图片描述

pop()方法

pop()方法出队,即删除队列头部元素,并返回。需要先判断一下队列是否为空,如果不会空,直接返回队列头的元素,之后移动队列头指针即可。

代码实现

/**
 * 删除队列中元素,从队列头部开始删除,先进先出
 * @return 删除的元素值
 */
public Object pop(){
    try{
        //判断队列是否为空
        if(!isEmpty()){
            //取出队列中的第一个元素
            Object data = arr[front];
            //移动头指针,队列头部
            front = (front+1) % arrLen;
            size--;
            return data;
        }
        return false;
    }catch (Exception e){
        return false;
    }
}

出队测试
在这里插入图片描述

peek()方法

peek()方法取出队列中第一个元素,和pop()出队方法差不多,需要先判断队列是否为空,如果不为空,直接返回队列头部元素即可。

代码实现

/**
 * 取出队列中第一个元素
 * @return 队列中第一个元素
 */
public Object peek(){
    try{
        if(!isEmpty()){
            return arr[front];
        }
        return false;
    }catch (Exception e){
        return false;
    }
}

clear()方法

clear()方法清空队列中的所有元素,清空队列中元素,只需要把队列头结点、尾结点和队列元素数量恢复初始化即可。

代码实现

public void clear(){
    front = rear = 0;
    size = 0;
}

全部代码

上述基于数组实现了队列的一些常用方法,下面是上述案例中的所有代码。有错误地方欢迎指出。

public class StrQueue {
    //队列数组
    public Object[] arr;
    //头指针
    public int front = 0;
    //尾指针
    public int rear = 0;
    //队列中元素个数
    public int size = 0;
    //队列数组长度默认为10
    public int arrLen = 10;

    //构造方法
    public StrQueue() {
        //无参构造方法,队列数组默认长度设置为10
        arr = new Object[arrLen];
    }

    //指定队列长度的构造方法
    public StrQueue(int arrLen) {
        this.arrLen = arrLen;
        arr = new Object[arrLen];
    }

    //判断队列是否满了
    public Boolean isFull(){
        //队列头和队列尾相等,即队列已满
        return (rear + 1) % arrLen == front;
    }

    //判断队列是否为空
    public Boolean isEmpty(){
        return size == 0;
    }

    //返回队列中的元素个数
    public Integer getSize(){
        return size;
    }

    /**
     * 添加元素到队列,队列添加元素都是添加在队列尾部
     * @param data 添加的元素值
     * @return Boolean
     */
    public Boolean add(Object data){
        //判断队列是否满了
        if(isFull()){
            System.out.println("队列已满!无法添加");
            return false;
        }
        //添加元素到队列
        arr[rear] = data;
        //改变尾指针位置
        rear = (rear+1) % arrLen;
        //队列元素个数自增
        size++;
        return true;
    }

    //遍历队列
    public void traverse(){
        //先找到队列头,从队列头部开始遍历
        int i = front;
        while (i != rear){
            System.out.println("编程小马:" + arr[i]);
            //移动队列头
            i = (i + 1) % arrLen;
        }
    }

    /**
     * 删除队列中元素,从队列头部开始删除,先进先出
     * @return 删除的元素值
     */
    public Object pop(){
        try{
            //判断队列是否为空
            if(!isEmpty()){
                //取出队列中的第一个元素
                Object data = arr[front];
                //移动头指针,队列头部
                front = (front+1) % arrLen;
                size--;
                return data;
            }
            return false;
        }catch (Exception e){
            return false;
        }
    }

    /**
     * 取出队列中第一个元素
     * @return 队列中第一个元素
     */
    public Object peek(){
        try{
            if(!isEmpty()){
                return arr[front];
            }
            return false;
        }catch (Exception e){
            return false;
        }
    }

    //清空队列
    public void clear(){
        front = rear = 0;
        size = 0;
    }

    public static void main(String[] args) {
        //实例一个队列
        StrQueue queue = new StrQueue();
        //添加元素
        queue.add(1);
        queue.add(2);
        queue.add(3);
        queue.add(4);
        //遍历队列
        queue.traverse();
        System.out.println();

        System.out.println("出队的元素:" + queue.pop());
        queue.traverse();
    }
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值