队列(queue)

目录

队列的基本概念

队列的通过数组的简单实现

链表队列

链表队列的入队

链表队列的出队


队列的基本概念

        队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列插入队列即入队列,删除即为出队列, 队列具有先进先出的特性

        队列就像日常饭堂排队一样只能从队尾加入队列,等到排到队头的时候才能打饭。

  • 假溢出:队列用的存储区还没有满,但队列却发生了溢出,我们把这种现象称为"假溢出"。
  • 真溢出:由于队列的存储区不够而产生的溢出叫真溢出;

队列的通过数组的简单实现

实现队列的入队,若队列已满则无法入队,且需要避免假溢出问题。

实现队列的出队,若队列的为空也无法出队

队列的遍历,从队头开始遍历至队尾

​
​
public class Queue {                                                            
                                                                                
    private int front;    //队头                                                      
                                                                                
    private int rear;     //队尾                                                     
                                                                                
    private int maxSize;  //队列的最大长度                                                      
                                                                                
    private int size;     //队列的当前长度                                                      
                                                                                
    private int[] queue;  



                                                      
   //构造方法,初始化队列,设置队列大小                                                                             
    public Queue(int maxSize) {                                                 
        this.maxSize = maxSize;                                                 
        this.queue = new int[maxSize];                                          
                                                                                
    }   
 

                                                                       
     //构造方法,初始化队列,设置队列大小,默认为10                                                                               
    public Queue(){                                                             
          this.maxSize=10;                                                      
          this.queue=new int[maxSize];                                          
    } 

                                                                          
    //入队列                                                                            
    public void queuePush(int param) throws Exception{                          
        if(isFull()){                                                           
            throw new Exception("该队列已满");                                       
        }                                                                       
        queue[rear]=param;                                                      
        rear=(rear+1)%maxSize;//防止出现假溢出的情况                                                  
        size++;                                                                 
    }   



                                                                        
    //出队列                                                                            
    public int queuePop()throws Exception{                                      
        if(isEmpty()){                                                          
            throw new Exception("该队列为空");                                       
        }                                                                       
        int last=queue[front];                                                  
         front=(front+1)%maxSize;                                               
         size--;                                                                
         return last;                                                           
    }   

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


    //遍历队列                                                                    
    public void forEach(){                                                      
        for(int i=0;i<size;i++){                                                
               System.out.println(queue[(i+front)%maxSize]);                    
        }                                                                       
    } 

                                                                       
    //判断队列是否溢出                                                                            
    public boolean isFull(){                                                    
        if(maxSize>size){                                                       
           return false;                                                        
        }                                                                       
        return true;                                                            
    }

}                                                                           

​

​

链表队列

  • 基于链表实现的队列
  • 该队列保存了队头与队尾的变量地址,这样可已方便操作,不需要手动搜索队尾,增加操作的时间。

链表队列的入队

  • 初始化时将该队列的地址赋给队头。
  • 该队列根据队尾的地址判断该队列是否为空。
  • 判断队列是否为空,为空则添加数据到队头中去,并把队尾指向队头。
  • 不为空则添加一个新LinkeaQueue数据至当前的队尾的next中去,并将队尾指向该变量地址。

链表队列的出队

  • 判断该队列是否为空,为空抛出异常。
  • 判断该队列的队头与队尾是否相同。
  • 相同则将队尾地址设为null,并返回队头的数据(以为该队列判断是否为空的标准为队尾是否为空,为空则队列为空,否则反之)

                                                              初始化的时的链表队列

 添加了数据的链表数组

public class LinkedQueue {

    private int date;  //存储的数据

    private  LinkedQueue rear; //队尾

    private  LinkedQueue front;  //队头

    private  LinkedQueue next;  //节点连接下一个LinkedQueue

    //初始化的的队列,front不为null
    public LinkedQueue(){
        front=this;
    }

    //添加数据使用的构造方法
    public LinkedQueue(int date){
        this.date=date;
    }


      //入队
    public void queuePush(int date){
        if(isEmpty()){
            front.date=date;
            rear=front;
        }else {
            rear.next=new LinkedQueue(date);
            rear=rear.next;
        }
    }


    //出队
    public int  queuePop()throws Exception{
        if(isEmpty()){
            throw new Exception("该队列为空");
        }
        int first=front.date;
        if(front==rear){
            rear=null;
        }else {
            front=front.next;
        }
        return first;

    }
    //判断是否为空
    public boolean isEmpty(){
        if(rear==null){
            return true;
        }
        return false;
    }


    //遍历队列
    public void forEach(){
        if(!isEmpty()){
            LinkedQueue linkedQueue =front;
            do{
                System.out.println(linkedQueue.date);
                linkedQueue=linkedQueue.next;
            }while (linkedQueue!=rear);
            System.out.println(linkedQueue.date);
        }
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值