考研笔记:有关双端队列知识点的探究

考研笔记:有关双端队列知识点的探究

双端队列是指允许两端都可以进行入队和出队操作的队列,其元素的逻辑结构仍是线性结构。将队列的两端分别称为前端和后端。
在这里插入图片描述 在双端队列进队时:前端进的元素排在后端进的元素前面,后端进的元素排在前端进的元素的后面。在双端队列出队时:无论前端还是后端出队,先出的元素排列在后出的元素的前面。

输出受限的双端队列:允许在一端进行插入和删除,但在另一端只允许插入的双端队列为输出受限的双端队列。
在这里插入图片描述

输入受限的双端队列:允许在一端进行插入和删除,但在另一端只允许删除的双端队列为输入受限的双端队列。
在这里插入图片描述
若以1234作为双端队列的输入序列,满足以下条件的输出队列有:
①能由输入受限的双端队列得到,不能由输出受限的双端队列得到的是4132
②能由输出受限的双端队列得到,不能由输入受限的双端队列得到的是4213
③既不能由输入受限的双端队列得到,又不能由输出受限的双端队列得到的是4231

对于上述结论,建议大家根据原理动手模拟画图并仔细分析相关原因、

接下来,我们由两段源码来基本的了解一下双端队列的基本特性。

代码一:

import java.util.ArrayDeque;
public class testArrayDeque {
     public static void main(String[] args) {
		ArrayDeque AD = new ArrayDeque();
		AD.add("a");
		AD.add("b");
		AD.add("c");
		System.out.println("当前队列为:" + AD);
		//在队列的前端插入元素
		AD.addFirst("d");
		System.out.println("在前端插入元素后队列为:" + AD);
		//在队列的后端插入元素
		AD.addLast("e");
		System.out.println("在后端插入元素后队列为:" + AD);
		//在队列的前端删除元素
		AD.removeFirst();
		System.out.println("在前端删除元素后队列为:" + AD);
		AD.removeFirst();
		System.out.println("在前端删除元素后队列为:" + AD);
		//在队列的后端删除元素
		AD.removeLast();
		System.out.println("在后端删除元素后队列为:" + AD);
		AD.removeLast();
		System.out.println("在后端删除元素后队列为:" + AD);
	}
}

编译结果:

当前队列为:[a, b, c]
在前端插入元素后队列为:[d, a, b, c]
在后端插入元素后队列为:[d, a, b, c, e]
在前端删除元素后队列为:[a, b, c, e]
在前端删除元素后队列为:[b, c, e]
在后端删除元素后队列为:[b, c]
在后端删除元素后队列为:[b]

代码二:

import java.util.Deque;
import java.util.LinkedList;

public class testDeque {
    public static void main(String[] args) {   
        Deque<String> deque = new LinkedList<String>();
        deque.add("a");
        deque.add("b");
        deque.add("c");
        //输出当前队列
        System.out.println("队列为:"+deque);
 
        //从队首加入元素(队列有容量限制时用,无则用addFirst)
        deque.offerFirst("d");
        System.out.println("队首加入元素后队列为:"+deque);
        //从队尾加入元素(队列有容量限制时用,无则用addLast)
        deque.offerLast("e");
        System.out.println("队尾加入元素后队列为:"+deque);
        
        //从队尾加入元素
        deque.offer("h");
        System.out.println("队尾加入元素后为:"+deque);
        
        //获取并移除队列第一个元素,pollFirst()也是,区别在于队列为空时,removeFirst会抛出NoSuchElementException异常,后者返回null
        deque.removeFirst();
        System.out.println("获取并移除队列第一个元素后为:"+deque);
        
        //获取并移除队列第一个元素,此方法与pollLast()唯一区别在于队列为空时,removeLast会抛出NoSuchElementException异常,后者返回null
        deque.removeLast();
        System.out.println("获取并移除队列最后一个元素后为:"+deque);
        
        //获取队列第一个元素.此方法与 peekFirst() 唯一的不同在于:如果此双端队列为空,它将抛出NoSuchElementException,后者返回null
        System.out.println("获取队列第一个元素:"+deque.getFirst());
        
        //获取队列最后一个元素.此方法与 peekLast() 唯一的不同在于:如果此双端队列为空,它将抛出NoSuchElementException,后者返回null
        System.out.println("获取队列最后一个元素:"+deque.getLast());
        
        //循环获取元素并在队列移除元素
        while(deque.size()>0){
            System.out.println("获取元素为:"+ deque.pop()+" 并删除");
        }
        System.out.println("队列为:"+deque);
    }

}

编译结果:

队列为:[a, b, c]
队首加入元素后队列为:[d, a, b, c]
队尾加入元素后队列为:[d, a, b, c, e]
队尾加入元素后为:[d, a, b, c, e, h]
获取并移除队列第一个元素后为:[a, b, c, e, h]
获取并移除队列最后一个元素后为:[a, b, c, e]
获取队列第一个元素:a
获取队列最后一个元素:e
获取元素为:a 并删除
获取元素为:b 并删除
获取元素为:c 并删除
获取元素为:e 并删除
队列为:[]

发布了9 篇原创文章 · 获赞 7 · 访问量 2121

猜你喜欢

转载自blog.csdn.net/weixin_43715601/article/details/100627987
今日推荐