QueueDemo+Deque 两种队列的演示

QueueDemo

/**
 *    队列Queue 的演示
 *    知识点: 队列是一种常用的数据机构, 遵循先进先出的原则
 *    可以将队列看成特殊的线性表,队列限制了对线性表的访问方式:
 *    只能从线性表的一端添加(offer)元素,从另一端取出(poll)元素。
 *    JDK中提供了Queue接口,同时使得LinkedList实现了该接口
 *    原因: 选择LinkedList实现Queue,因为Queue经常要进行插入和删除的操作,
 *    而LinkedList在这方面效率较高。
 *    应用: 比如游戏列队,需要有序的出入,有排队需求的情况,可以使用队列数据结构.
 *
 *    主要方法:
 *    1. boolean offer(E e):将元素追加到队列末尾,若添加成功则返回true。
    2. E poll():从队首删除并返回该元素。
    3. E peek():返回队首元素,但是不删除。
 *
 *    练习:
 *    1) 使用LinkedList构建队列,将字符串“a”、“b”、“c”放入队列中。
    2) 获取队列中队首元素。
    3      添加字符串"d"到队列中.
    4) 从队首开始删除元素,直到队列中没有元素为止,并在删除的同时输出删除的队首元素。

    个人总结:
    1.关于队列数据结构,是线性的,就是只能从尾巴进去,头出来. 遵循先进先出原则(例如一根多节铅笔)
    2.遍历操作在队列中用for不如用while, 而且要把队列的size()当循环条件和循环变量.
    3.遍历操作在队列中是一次性的,遍历一次,队列就无元素了.
    4.如果用peek方法遍历队列,只能无限的取出同一个队首元素.因为它只是获取队首元素,并不移除队首元素.
 */
public class QueueDemo {
    public static void main(String[] args) {
        //1.使用LinkedList构建队列,将字符串“a”、“b”、“c”放入队列中。
        Queue<String> queueList = new LinkedList<String>();
        queueList.offer("a");
        queueList.offer("b");
        queueList.offer("c");

        //2.获取队列中队首元素。
        /*
         * E peek()
         */
        String first = queueList.peek();    //获取但不移除此队列的头;如果此队列为空,则返回 null。
                        //返回值 队列首元素, 但是并不移除队列首元素.
        System.out.println("队列首元素为"+first);    //队列首元素为a
        System.out.println(queueList);    //[a, b, c]

        //3.添加字符串"d"到队列中.
        /*
         * boolean offer()
         * 将指定的元素插入此队列, 如果该元素已添加到此队列,则返回 true;否则返回 false
         */
        boolean r = queueList.offer("d");
        System.out.println("字符串是否添加成功:"+r);
        //字符串是否添加成功:true
        System.out.println(queueList);
        //[a, b, c, d]

        //4.从队首开始删除元素,直到队列中没有元素为止,并在删除的同时输出删除的队首元素。
        /*
         * E poll
         * 获取并移除此队列的头,如果此队列为空,则返回 null。
         * 思路:遍历队列, 不断取出队首, 即删除成功
         * 注意:遍历队列不要常做,因为需要都取出来才能遍历全部元素.
         *           遍历队列的方法用while,因为for经实验,不合适,因为队列的Size(),在不断的循环
         * 过程中,不断的减少.所以while( 队列的Size()>0 )即可.
         *
         */
        while(queueList.size()>0){
            String delStr = queueList.poll();
            //注意:这里如果使用list.peek(),会死循环,不断的查看同一个队首元素
            System.out.println("删除元素(队首元素): "+delStr);
        }
        System.out.println(queueList);
        /*
         * 输出结果:
         *     删除元素(队首元素): a
            删除元素(队首元素): b
            删除元素(队首元素): c
            删除元素(队首元素): d
            []
         */
    }
}

StackDemo 双端队列

/**
 *    Deque接口,是Queue的子接口.定义了所谓“双端队列.
 *    即从列队的两端分别可以入队(offer)和出队(poll).
 *    同样LinkedList实现了该接口.如果将Deque限制成
 *    只从一端入队(push)出队(pop),就形成了Stack的数据结构.
 *    栈 遵循 先进后出原则.
 *    应用场景:需要后退操作,前进操作的时候(例如Windos的前进后退功能)
 *
 *    Deque提供了操作栈的相关方法,其主要方法如下:
    void push(E e):将给定元素"压入"栈中。存入的元素会在栈首。即:栈的第一个元素
    E pop():将栈首元素删除并返回。

 *    本案例要求测试Deque的用法,详细要求如下:
    1) 使用LinkedList构建栈,将字符串“a”、“b”、“c”放入栈中。
    2) 获取栈中栈顶元素。
    3) 从栈顶开始删除元素,直到栈中没有元素为止,并在删除的同时输出删除的栈顶元素。
 *
 */
public class StackDemo {

    public static void main(String[] args) {
        //1) 使用LinkedList构建栈,将字符串“a”、“b”、“c”放入栈中。
        Deque<String> stackList = new LinkedList<String>();
        stackList.push("a");
        stackList.push("b");
        stackList.push("c");

        /*
         * void push(E e)
         * 将给定元素"压入"栈中。存入的元素会在栈首。
         */
        stackList.push("d");     //"d" 入栈

        //2) 获取栈中栈顶元素。
        /*
         * E peek()  获取,但不移除此双端队列所表示的队列的头部
         * (换句话说,此双端队列的第一个元素);
         * 如果此双端队列为空,则返回 null。
         */
        String topStr = stackList.peek();
        System.out.println("栈顶元素 :"+topStr);        //栈顶元素 :d
        System.out.println(stackList);                    //[d, c, b, a]

        //3) 从栈顶开始删除元素,直到栈中没有元素为止,并在删除的同时输出删除的栈顶元素。
        /*
         * E pop()
         * 将栈首元素删除并返回。
         * 思路:遍历栈队列,挨个弹栈(pop)
         */
        while(stackList.size()>0){
            String outStr = stackList.pop();
            System.out.println("弹栈元素: "+outStr);
        }
        System.out.println(stackList);
        /*输出结果:
             弹栈元素: d
            弹栈元素: c
            弹栈元素: b
            弹栈元素: a
            []
         */
    }
}

时间: 2024-08-24 15:52:18

QueueDemo+Deque 两种队列的演示的相关文章

两种队列

1.Stack和Queue Stack是先进后出的,Queue是先进先出的. 使用方法如下: public class Dog { public string Name { get; set; } public Dog(string name) { this.Name = name; } public void ConsoleName() { Console.WriteLine(this.Name); } } //栈 先进后出 Stack<Dog> s = new Stack<Dog&g

[Todo] Redis里面队列的两种模式,以及抢红包在Redis中的实现

两种队列模式: 一种是利用list的lpush/rpop等 另一种是redis自带的发布者/订阅者模式 http://www.cnblogs.com/alazalazalaz/p/5512258.html 抢红包: 下面这个是用Java实现: https://my.oschina.net/ydsakyclguozi/blog/536748 Redis里面lpush等操作的一些参考: http://redis.readthedocs.io/en/2.6/list/rpoplpush.html

使用java语言实现一个队列(两种实现比较)(数据结构)

一.什么是队列,换句话说,队列主要特征是什么? 四个字:先进先出 六个字:屁股进,脑袋出 脑补个场景:日常排队买饭,新来的排在后面,前面打完饭的走人,这就是队列: OK,思考一个问题,我为什么写了两种实现,它们的区别是什么,哪个性能更好一些? 我觉得学习一定要带着问题来学习: 二.队列的两种实现 1.数组队列 数组队列比较简单,基于之前写的动态数组所实现的,基本方法都是根据队列的特性从而选择性的调用动态数组的方法来实现的. public class ArrayQueue<E> implemen

7、java实现的两种单例模式

/* 两种单例模式的演示 */ //饿汉式 class Signal { private Signal(){} private Signal s = new Signal(); public static Signal getInstance() { return s; } } //懒汉式 class Signal { private Signal(){} private Signal s = null; public static Signal getInstance() { if(s ==

队列ADT的两种简单实现

队列在书中说明的方式是两种,一种最简单的链表队列,判断情况比较简单,另一种是使用数组进行创建,限制较多,但是速度较快,也比较容易控制内存,不至于出现在链表实现上那么复杂的内存控制. 下面先是链表实现: ListQueue.cpp 1 #include "iostream" 2 #include "stdlib.h" 3 4 typedef struct _queue_ 5 { 6 int data; 7 struct _queue_ *next; 8 }queue;

两种方法实现队满和队空的判断操作(循环队列)

本周的作业要求: 1.给出循环队列的存储结构定义. 2.完成循环队列的基本操作函数. 1)      初始化循环队列: 2)      建立循环队列: 3)      实现入队和出队操作: 4)     采用下面两种方法实现对满和队空的判断操作: 方法一:修改队满条件,浪费一个元素空间,队满时数组中只有一个空闲单元(必做):   方法二:设置标志flag,当front==rear且flag=0时为队空,当front==rear且flag=1时为队满(必做): 3.编写主函数实现基本操作函数功能,

两种常用的队列

与栈相反,队列是一种先进先出的线性表.它只允许在表的一端进行插入,而在另一端删除元素. 和线性表类似,队列也可以有两种存储表示. 用链表表示的队列简称链队列.下面是带头结点的单链队列的实现 1 #include <stdio.h> 2 #include <malloc.h> 3 4 typedef char QElemType; 5 //单链队列节点 6 typedef struct QNode 7 { 8 QElemType data; 9 struct QNode *next;

deque双端队列容器

C++中的STL还是比较有用的,尤其是在做科研实现算法的时候,之前也有用过,但是没怎么系统地学过,因此最近找了本书,大致浏览了一下,叶志军的那本<C++ STL开发技术导引>,科普.入门性质的一本书,写得比较浅[呵呵,勿喷].下面的内容大部分是摘自该书. deque双端队列容器(double-ended queue),可以在尾部.头部插入.删除元素,采用分块的线性结构来存储数据,两个迭代器分别指向容器的首尾元素,以deque块为单位进行内存分配,使用二级的Map进行管理. 创建deque对象

go---&gt;共享内存和通信两种并发模式原理探究

共享内存和通信两种并发模式原理探究 并发理解 人类发明计算机编程的本质目的是为了什么呢?毫无疑问是为了解决人类社会中的各种负责业务场景问题.ok,有了这个出发点,那么想象一下,比如你既可以一心一意只做一件事,你也可以同时做多件事,比如,你计划今天上午计划就是看足球比赛,ok,你今天的工作就是串行的,单进程的,你只需要完成一件事.但是不巧呢,你妈妈说让你帮她切肉,你妈妈上午要出门有点事,同时不巧呢,你老婆说她上午也要出门,让你帮着打扫家里卫生,这时你今天就要同时做三件事,看比赛,切肉,打扫卫生.这