栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【恋上数据结构】队列 Queue

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【恋上数据结构】队列 Queue

GItee持续更新

文章目录
    • 六、队列(Queue)
      • 1.接口设计
      • 2.练习-用栈来实现队列
      • 3.双端队列(Deque)
      • 4.循环队列(Circle Queue)

六、队列(Queue)

队列是一种特殊的线性表,只能在头尾两端进行操作。

先进先出

1.接口设计

队列中的方法总结:

优先使用双向链表,因为动态数组在头操作复杂度较高。

package 栈和队列;


import java.util.linkedList;


public class Queue {
    private linkedList linkedList = new linkedList();

    
    public int size(){
       return linkedList.size();
    }

    
    public boolean isEmpty(){
        return linkedList.isEmpty();
    }

    
    public void offer(E element){
        linkedList.add(element);
    }

    
    public E poll(){
       return linkedList.poll();
    }

    
    public E peek(){
        return linkedList.get(0);
    }
}

public class QueueTest {
    public static void main(String[] args) {
        Queue queue = new Queue();
        queue.offer(99);
        queue.offer(88);
        queue.offer(77);
        System.out.println(queue.peek());
        while (!queue.isEmpty()){
            System.out.println(queue.poll());
        }
    }
}

2.练习-用栈来实现队列

思路:

  • 用两个栈来模拟队列、

  • 入队时,push到 S1中

  • 出队时

    如果S2为空,将S1中所有的元素弹出,push到S2中,S2弹出栈顶元素。

    如果S2不为空,S2弹出栈顶元素。

实现

class MyQueue {

   
    private Stack queueHead ;
    
    private Stack queueTail ;
    public MyQueue() {
        queueHead = new Stack<>();
        queueTail = new Stack<>();
    }

    public void push(int x) {
        queueTail.push(x);
    }

    public int pop() {
        if (queueHead.empty()) {
            while (!queueTail.empty()) {
                Integer e = queueTail.pop();
                queueHead.push(e);
            }
        }
        return queueHead.pop();
    }

    public int peek() {
        if (queueHead.empty()) {
            while (!queueTail.empty()) {
                Integer e = queueTail.pop();
                queueHead.push(e);
            }
        }
        return queueHead.peek();
    }

    public boolean empty() {
        return queueHead.isEmpty() && queueTail.isEmpty();
    }
}

3.双端队列(Deque)

接口设计

Queue与Deque比较

Stack与Deque比较

4.循环队列(Circle Queue)

我们可以建立一个数组和两个指针来模拟循环队列。另外还设置了一个用来计数的变量,记录数组中元素的个数,使得我们能够更加容易的去判断队列当前的状态,已满或者为空。

class MyCircularQueue {
    		int[] queue;
    		int size;//对列的容量
    		int front;//头指针
    		int rear;//尾指针
    		int E_num;//当前队列中元素的个数
    	    public MyCircularQueue(int k) {//初始化
    	    	this.queue=new int[k];
    	    	this.size=k;
    	    	this.front=-1;
    	    	this.rear=0;
    	    	this.E_num=0;
    	    }
    	    public boolean enQueue(int value) {//入队
    	    	if(E_num>=size) return false;
    	    	front=(front+1)%size;
    	    	queue[front]=value;
    	    	E_num++;
    	    	return true;
    	    }
    	    public boolean deQueue() {//出队
    	    	if(E_num==0) return false;
    	    	rear=(rear+1)%size;
    	    	E_num--;
    	    	return true;
    	    }
    	    public int Front() {//获取队头元素(当前所有元素中最先进入的元素)
    	    	if(E_num==0) return -1;
    	    	return queue[rear];
    	    }
    	    
    	    public int Rear() {//获取队尾元素(当前所有元素中最后入队的元素)
    	    	if(E_num==0) return -1;
    	    	return queue[front];
    	    }
    	    public boolean isEmpty() {//判断队空
    	    	if(E_num==0) return true;
    	    	return false;
    	    }
    	    public boolean isFull() {//判断队是否已满
    	    	if(E_num==size) return true;
    	    	return false;
    	    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/687148.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号