leedcode225.用队列实现栈(java版)

本文介绍了如何利用Java的队列特性模拟栈,包括使用双端队列直接实现和通过两个普通队列进行元素交换的方法,展示了如何用代码实现栈的先进后出特性。
摘要由CSDN通过智能技术生成

题目:链接

题目简介

题目解析:题目要求用对列实现栈;目标:用队列模拟栈的特性:先进后出

明确队列和栈的特性:

队列:先进先出

特殊的队列--双端对列:两端都可以进行插入和删除

栈:先进后出

方法一:双端对列

补充java中双端创建对象和常见的方法:

创建对象:可以使用Java集合框架提供的Deque接口的实现类,例如ArrayDeque、LinkedList等。以ArrayDeque为例,可以通过以下步骤创建一个ArrayDeque对象

Deque<String> deque = new ArrayDeque<>();

常见方法:

  • addFirst(e):在队列头部插入元素e
  • addLast(e):在队列尾部插入元素e
  • removeFirst():移除并返回队列头部的元素
  • removeLast():移除并返回队列尾部的元素
  • peekLast()方法可以获取双端队列(Deque)的队尾元素,但不会从队列中移除它

 双端对列有一个很好的特性:队尾可以插入和删除,这不就是栈的特性吗?

举例:我们顺序插入  1,2,3.

只在队尾进行插入和删除,就是一个逻辑上的栈;

代码如下:

class MyStack {
    Deque<Integer> q1;
   

    public MyStack() {
        q1=new ArrayDeque<>();
       
    }
    
    public void push(int x) {
        q1.addLast(x);
    }
    
    public int pop() {
         
        return q1.removeLast();
    }
    
    public int top() {
        return  q1.peekLast();
    }
    
    public boolean empty() {
        return q1.isEmpty() ;
    }
 
}

方法二:两个普通对列

        若只在队尾添加元素,在队头删除元素,可以用另一个队列作为中转,交换元素顺序实现元素的先进后出;

代码逻辑:在添加元素之前,需要把队列1的元素移动到队列2中,在从队列2中移动到队列1中,【当然中转队列可能是多余的,我们也可以直接用一个队列实现】

    public void push(int x) {
        while (q1.size() > 0) {
            q2.add(q1.poll());
        }
        q1.add(x);
        while (q2.size() > 0) {
            q1.add(q2.poll());
        }
    }

完整代码:

class MyStack {
    Queue<Integer> q1;
     Queue<Integer> q2;
   

    public MyStack() {
        q1=new LinkedList<>();
        q2=new LinkedList<>();
       
    }
    
    public void push(int x) {
        while(!q1.isEmpty()){
            q2.add(q1.remove());
        }
        q1.add(x);
        while(!q2.isEmpty()){
            q1.add(q2.remove());
        }
    }
    
    public int pop() {
         
        return q1.remove();
    }
    
    public int top() {
        return  q1.peek();
    }
    
    public boolean empty() {
        return q1.isEmpty() ;
    }
 
}

与用栈实现队列略有差异,大家可以参考这篇博客:用栈实现对列

方法三:一个普通对列

可以看到用两个队列先显得冗余,可以直接在一个队列中进行中转。

代码块:

class MyStack {
    Queue<Integer> q1;
     
   

    public MyStack() {
        q1=new LinkedList<>();    
       
    }
    
    public void push(int x) {
        q1.add(x);
        int num=q1.size();
        while(num>1){
            q1.add(q1.remove());
            num--;
        }
         
        
    }
    
    public int pop() {
         
        return q1.remove();
    }
    
    public int top() {
        return  q1.peek();
    }
    
    public boolean empty() {
        return q1.isEmpty() ;
    }
 
}

leedcode232.用栈实现队列icon-default.png?t=N7T8https://blog.csdn.net/m0_74132709/article/details/136010157

  • 22
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

〖七月〗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值