首页 > 编程语言 >3分钟了解Java中Stack,Queue,Deque常用方法

3分钟了解Java中Stack,Queue,Deque常用方法

时间:2023-03-15 19:22:28浏览次数:53  
标签:Deque Java System st Queue println dq queue out

stack

常用语法

boolean empty() 
    测试堆栈是否为空。
Object peek( )
    查看堆栈顶部的对象,但不从堆栈中移除它。
Object pop( )
    移除堆栈顶部的对象,并作为此函数的值返回该对象。
Object push(Object element)
    把项压入堆栈顶部。
int search(Object element)
    返回对象在堆栈中的位置,以 1 为基数。
package stackandqueue;

import java.util.Stack;

public class StackTest {
    public static void main(String[] args) {
        //1. 创建一个栈st;
        Stack<Integer> st = new Stack<>();
        //2. Object push(Object element)
        showpush(st,12);
        showpush(st,45);
        showpush(st,90);
        //3. peek()查看栈顶的对象,不从栈中移除它;
        int p1 = st.peek();
        System.out.println("此时栈顶元素:" + p1);
        //4. pop() 移除栈顶对象,返回该对象的值;
        System.out.println("pop出一个元素出去" + st.pop());
        int p2 = st.peek();
        System.out.println("此时栈顶元素:" + p2);

        //5. empty() 是否为空
        if (!st.empty()) {
            System.out.println("当前栈不为空");
        } else {
            System.out.println("当前栈为空");
        }
    }

    private static void showpush(Stack<Integer> st, int a) {
        st.push(a);
        System.out.println("push(" + a + ")");
        System.out.println("stack: " + st);
    }
}

/*
push(12)
stack: [12]
push(45)
stack: [12, 45]
push(90)
stack: [12, 45, 90]
此时栈顶元素:90
pop出一个元素出去90
此时栈顶元素:45
当前栈不为空
* */

queue

队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。
LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。

offer,add 区别:

一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。
这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。

poll,remove 区别:

remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似, 但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。

peek,element区别:

element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。

package stackandqueue;

import java.util.LinkedList;
import java.util.Queue;

public class QueueTest {
    public static void main(String[] args) {
        Queue<Integer> queue = new LinkedList<>();
        // 1. offer()
        queue.offer(2);
        queue.offer(4);
        queue.offer(5);
        queue.offer(6);
        queue.offer(9);
        System.out.println("queue: " + queue);
        // 2. poll() 返回第一个元素,并在队列中删除
        System.out.println(queue.poll());
        System.out.println("删除队首元素,queue: " + queue);

        // 3. peek() 返回第一个元素
        System.out.println(queue.peek());

        // 4. element() 返回第一个元素
        System.out.println(queue.element());
        System.out.println("queue: " + queue);
    }
}
/*
queue: [2, 4, 5, 6, 9]
2
删除队首元素,queue: [4, 5, 6, 9]
4
4
queue: [4, 5, 6, 9]
* */

deque

允许两头都进,两头都出,这种队列叫双端队列(Double Ended Queue),学名Deque。
Deque实现了一个双端队列(Double Ended Queue),它可以:

  1. 将元素添加到队尾或队首:addLast()/offerLast()/addFirst()/offerFirst();
  2. 从队首/队尾获取元素并删除:removeFirst()/pollFirst()/removeLast()/pollLast();
  3. 从队首/队尾获取元素但不删除:getFirst()/peekFirst()/getLast()/peekLast();
    注意:
  4. 总是调用xxxFirst()/xxxLast()以便与Queue的方法区分开;
  5. 避免把null添加到队列。

代码:

package stackandqueue;

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

public class DequeTest {
    public static void main(String[] args) {
        Deque<String> dq = new LinkedList<>();
        //1. 将元素添加到队尾或队首:addLast()/offerLast()/addFirst()/offerFirst();
        dq.addFirst("baidu");
        dq.offerFirst("alibaba");
        dq.addLast("ithome");
        dq.offerLast("benjamin");
        System.out.println("dq: " + dq); //dq: [alibaba, baidu, ithome, benjamin]
        System.out.println("dq当前的状态是:不为空(" + dq.isEmpty() + ")");
        //2. 从队首/队尾获取元素但不删除:getFirst()/peekFirst()/getLast()/peekLast();
        System.out.println(dq.getFirst()); //alibaba
        System.out.println(dq.peekFirst()); //alibaba
        System.out.println(dq.getLast()); //benjamin
        System.out.println(dq.peekLast()); //benjamin
        //3. 从队首/队尾获取元素并删除:removeFirst()/pollFirst()/removeLast()/pollLast();
        System.out.println(dq.removeFirst());
        System.out.println("dq: " + dq); //dq: [baidu, ithome, benjamin]

        System.out.println(dq.pollFirst());
        System.out.println("dq: " + dq); //dq: [ithome, benjamin]

        System.out.println(dq.removeLast());
        System.out.println("dq: " + dq); //dq: [ithome]

        System.out.println(dq.pollLast());
        System.out.println("dq: " + dq); //dq: []

        System.out.println("dq当前的状态是:为空(" + dq.isEmpty() + ")");

    }
}

利用deque实现stack

涉及到的方法:
栈方法 等效方法
push(e) push()/addFirst(e)
pop() pop()/removeFirst()
peek() peek()/peekFirst()

参考代码:

package stackandqueue;

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

public class StackTest {
    public static void main(String[] args) {
        //1. 创建一个栈st;
        Stack<Integer> st = new Stack<>();
        //2. Object push(Object element)
        showpush(st,12);
        showpush(st,45);
        showpush(st,90);
        //3. peek()查看栈顶的对象,不从栈中移除它;
        int p1 = st.peek();
        System.out.println("此时栈顶元素:" + p1);
        //4. pop() 移除栈顶对象,返回该对象的值;
        System.out.println("pop出一个元素出去" + st.pop());
        int p2 = st.peek();
        System.out.println("此时栈顶元素:" + p2);

        //5. empty() 是否为空
        if (!st.empty()) {
            System.out.println("当前栈不为空");
        } else {
            System.out.println("当前栈为空");
        }

        System.out.println("========利用deque实现========");
        // 利用deque实现
        Deque<Integer> st2 = new LinkedList<>();

        showpush2(st2,12);
        showpush2(st2,45);
        showpush2(st2,90);
        //3. peek()查看栈顶的对象,不从栈中移除它;
        int sp2 = st2.peek();
        System.out.println("此时栈顶元素:" + sp2);
        //4. pop() 移除栈顶对象,返回该对象的值;
        System.out.println("pop出一个元素出去" + st2.pop());
        int sp3 = st2.peek();
        System.out.println("此时栈顶元素:" + sp3);

        //5. empty() 是否为空
        if (!st2.isEmpty()) {
            System.out.println("当前栈不为空");
        } else {
            System.out.println("当前栈为空");
        }
    }

    private static void showpush(Stack<Integer> st, int a) {
        st.push(a);
        System.out.println("push(" + a + ")");
        System.out.println("stack: " + st);
    }

    private static void showpush2(Deque<Integer> st, int a) {
        st.push(a);
        System.out.println("push(" + a + ")");
        System.out.println("stack: " + st);
    }
}

/*
push(12)
stack: [12]
push(45)
stack: [12, 45]
push(90)
stack: [12, 45, 90]
此时栈顶元素:90
pop出一个元素出去90
此时栈顶元素:45
当前栈不为空
* */

/*
*
========利用deque实现========
push(12)
stack: [12]
push(45)
stack: [45, 12]
push(90)
stack: [90, 45, 12]
此时栈顶元素:90
pop出一个元素出去90
此时栈顶元素:45
当前栈不为空
* */

利用deque实现queue

涉及到的方法:
队列方法 等效方法
add(e) addLast(e)
remove() removeFirst()
element() getFirst()

参考代码:


package stackandqueue;

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

public class QueueTest {
    public static void main(String[] args) {
        Queue<Integer> queue = new LinkedList<>();
        // 1. offer()
        queue.offer(2);
        queue.offer(4);
        queue.offer(5);
        queue.offer(6);
        queue.offer(9);
        System.out.println("queue: " + queue);
        // 2. poll() 返回第一个元素,并在队列中删除
        System.out.println("删除队首元素: " + queue.poll());
        System.out.println("此时queue: " + queue);

        // 3. peek() 返回第一个元素
        System.out.println(queue.peek());

        // 4. element() 返回第一个元素
        System.out.println(queue.element());
        System.out.println("queue: " + queue);

        System.out.println("====使用deque使用queue===");
        Deque<Integer> deque = new LinkedList<>();
        deque.addLast(2);
        deque.addLast(4);
        deque.addLast(5);
        deque.addLast(6);
        deque.addLast(9);
        System.out.println("deque实现的队列:" + deque);
        System.out.println("删除队首元素:" + deque.pollFirst());
        System.out.println("此时队列:" + deque);

        System.out.println("获取当前队列的首元素:" + deque.peekFirst());
        System.out.println("此时队列:" + deque);

        System.out.println("判断此时队列是否为空:" + deque.isEmpty());

    }
}
/*
queue: [2, 4, 5, 6, 9]
删除队首元素: 2
此时queue: [4, 5, 6, 9]
4
4
queue: [4, 5, 6, 9]
====使用deque使用queue===
deque实现的队列:[2, 4, 5, 6, 9]
删除队首元素:2
此时队列:[4, 5, 6, 9]
获取当前队列的首元素:4
此时队列:[4, 5, 6, 9]
判断此时队列是否为空:false

Process finished with exit code 0

* */

参考文献

  1. https://www.liaoxuefeng.com/wiki/1252599548343744/1265122668445536
  2. https://www.runoob.com/java/java-stack-class.html

标签:Deque,Java,System,st,Queue,println,dq,queue,out
From: https://www.cnblogs.com/benjieqiang/p/17219696.html

相关文章

  • Java 关键字 transient
    前言最近在看HashMap源代码的时候,发现链表table数组采用了transient关键字,笔者当时感觉对transient关键字即陌生但又有似曾相识,所以花了一些时间简要的总结了下使......
  • 【学习日志】Java基本数据类型的自动装箱和拆箱
    //测试代码publicstaticvoidmain(String[]args){Integera=1;Integerb=2;Integerc=3;Integerd=3;Integ......
  • Java字符串基础练习题2(较难)
    ​生成验证码内容:可以是小写字母,也可以是大写字母,还可以是数字​规则: 长度为5 内容中是四位字母,1位数字。 其中数字只有1位,但是可以出现在任意的位置。publicstati......
  • java进阶 -JFrame36
      packagecom.cyjt97.Frame;importjavax.swing.*;publicclassJFrameDEME{publicstaticvoidmain(String[]args){//创建窗体JFr......
  • Java:SpringBoot获取所有接口的路由映射关系
    重要:版本很重要,先说一下版本,版本不一样,可能获取结果也不一样spring-boot2.7.7java1.8定义一个查看路由的数据结构packagecom.example.demo.entity;importlombok.......
  • JAVA开发 电信支付系统短信模块精准发送短信
    电信支付测试环境检测支付系统设备磁盘运行情况,监控磁盘到一定阀值,从client连到支付系统的统一短信模块,统一短信模块连接到短信发送系统,发送短信。短信模块也可应用于业务预......
  • SPARK 使用Java 在IDE中实战RDD和DataFrame动态转换操作
    /***王家林老师授课​​​http://weibo.com/ilovepains​​*/ 源文件1,Spark,72,Hadoop,113,Flink,5 运行结果 ......
  • Java float 和 double 精度问题
    先看现象涉及诸如float或者double这两种浮点型数据的处理时,偶尔总会有一些怪怪的现象,不知道大家注意过没,举几个常见的栗子:典型现象(一):条件判断超预期System.out.println(......
  • java接口学习笔记
    目录java接口学习笔记1.抽象类和抽象方法2.接口3.抽象类和接口对比参考java接口学习笔记1.抽象类和抽象方法抽象方法:abstractvoidf();抽象类:包含抽象方法的类称......
  • Java+Redis 通过Lua 完成库存扣减,创建消息队列,异步处理消息--实战
    需要完成功能借助redisStream数据结构实现消息队列,异步完成订单创建,其中涉及到了缓存(击穿,穿透,雪崩),锁(Redisson),并发处理,异步处理,Lua脚本IDE:IDEA2022 1、读取库存数......