队列其实很简单

我们知道队列是一个非常常用的底层数据结构
他具有先进先出(FIFO)的特性
而和他很亲近的栈具有先进后出的特性

当然我们知道栈和队列都可以利用数组和链表实现特性
我们今天来考虑两个事情:
1、使用数组实现循环队列结构
2、使用双栈实现队列结构

使用数组实现循环队列结构

一个队列的状态
在这里插入图片描述
在这里插入图片描述

  1. 插入节点的时候向end指针指向的位置插入节点,然后end向后移动
  2. 出队的时候将head 指针指向的位置的数据出队,head指针后移
  3. 当head等于end的时候队列为空
  4. 当添加元素end后移之后,与head相等,说明队列已满这时候需要扩容
  5. 上述的向后移动都不是单纯的,而是加一然后对数组长度进行除余
public class RoundQue<T> {
    private T[] dataBase = (T[])new Object[10];
    private int head = 0;
    private int end = 0;
    public void add(T t){
        System.out.println("head:"+head+"   数据:"+t);
        dataBase[head] = t;
        head = (head+1)%dataBase.length;
        if(head == end){
            System.out.println("队列满为空,当前的长度是"+dataBase.length);
            T[] dataBase1 = (T[])new Object[dataBase.length*2];
            int e = end;
            for(int i = 0; i < dataBase.length ; i++){
                dataBase1[e+i] = dataBase[end];
                end = (end+1)%dataBase.length;
            }
            head += (dataBase.length);
            dataBase = dataBase1;
        }
    }
    public T get(){
        System.out.println("当前head为"+head+"当前end为"+end);
        if(head == end){
            System.out.println("队列为空");
            return null;
        }
        T t = dataBase[end];
        dataBase[end] = null;
        end = (end+1)%dataBase.length;
        return t;
    }
}

使用双栈实现队列结构

是不是很奇葩
用栈实现队列可能会更加的麻烦,用两个栈无形中增加了空间负责度
不过两个栈中一个出队栈、一个入队栈,分开操作,不会相互影响更加安全

在这里插入图片描述

  1. 初始的两个空的栈
  2. 添加数据(入队)直接进入 入队栈
  3. 如果现在要进行出队 ,从 出队栈 中出栈,入过当前栈为空,则将入队栈中的数据全部出队依次放入入队栈(这样在入队栈中是倒序的,到了出队栈就成了顺序)
public class TwoStackForQue<T> {

    private Stack<T> stackout = new Stack<T>();
    private Stack<T> stackin = new Stack<T>();
    private int count;

    public void add(T t){
        if(t!=null) {
            stackin.add(t);
        }else{
            System.out.println("插入值为空,对不起不能插入");
        }
    }
 
    public T pop() {
        if(stackout.isEmpty()&&!stackin.isEmpty()){
            while(!stackin.isEmpty()){
                stackout.add(stackin.pop());
            }
        }
        return stackout.pop();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值