数据结构-队列

一、介绍

1.1 队列是什么结构

队列和生活中排队的场景非常一致,先来的人先买后来的人后买,后来的人只能站在队尾,不允许插队。队列和栈一样,也是一种操作受限的线性表数据结构。
其他特殊队列:循环队列、阻塞队列、并发队列

二、队列的实现

与栈一样,队列可以基于数组实现也可以基于链表来实现。分别称为顺序队列链式队列。

2.1 基于数组的顺序队列的实现

public class ArrayQueue{
	private String[] items;
    private int n=0;
    //队头下标
    private int head=0;
    //队尾下标
    private int tail=0;
    
	//构造方法
    public ArrayQueue(int capacity){
        items = new String(capacity);
        n = capacity;
    }

    //入队
    public boolean enqueue(String item){
        if(tail==n){
            return false; //队列已满
        }
        items[tail] = item;
        tail++;
        return true;
    }

    //出队
    public String dequeue(){
        if(head==tail){
            return null; //队列为空
        }
        String ret=items[head];
        ++head;
        return ret;
    }
}

2.2 一般队列存在的问题

在2.1的顺序队列中中,数据出队后,head指针前面,会存在未占用的空间无法得到使用。这样的话,可能需要进行数据搬移。
数据搬移方案:在插入数据时,如果tail指向了数组尾部,则进行一次数据搬移,将head搬移到下标为0的位置

2.3 循环队列

  1. 循环队列,是将普通队列首尾相连,那么他就变成了循环队列。这样的话,就避免了数据搬移的损耗,但是也增加了操作的复杂度。
  2. 循环队列判断队列空的话,也是tail=head,但是判断队列满的话,就比较特殊,因为要留出1个位置不能存值,来判断队列满和空的区别。循环队列队列满的话,为** (tail+1)%n=head**
public class CircularQueue{
	private String[] items;
    private int n=0;
    private int head=0;
    private int tail=0;
	
    //构造方法
    public CircularQueue(int capacity){
        items=new String[capacity];
        n=capacity;
    }

	//入队
    public boolean enqueue(String item){
         if((tail+1)%n=head){
             return false; //队列已满
         }
        itmes[tail] = item;
        tail=(tail+1)%n;
        return true;
    }

    //出队
    public String dequeue(){
    	if(head ==tail ){
            return null; //队列已空
        }
        String ret=items[hdead];
        head = (head +1 ) % n;
        return ret;
    } 
}
posted @   青花石  阅读(9)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
点击右上角即可分享
微信分享提示