两栈实现一队列、两队列实现一栈

既然写到这两个题了,我之前的博客也没介绍栈跟队列,就简单的说一说

放在最下面的,如果想要了解栈跟队列的童鞋可以看看我的理解

先say say这两道题

1、两个栈实现一个队列
思路:
这没啥说的,队列特性、先进先出,想办法先拿到黑的
在这里插入图片描述
添加元素、入队: 直接添加即可

出队: 将stack1中元素依次出栈,入栈到stack2

此时stack2栈顶元素就是队列第一次进来的元素

这块注意的是,stack2不为空时,才添加元素;否则直接返回stack2栈顶元素
代码:

class MyQueue {
    private Stack<Integer> stack1;//入栈
    private Stack<Integer> stack2;//出栈

    public MyQueue() {
        stack1 = new Stack<>();
        stack2 = new Stack<>();
    }

    public void push(int val) {
        stack1.push(val);
    }

    public int pop() {
        //模拟队列,s2不为空,直接就出元素
        //要是为空就要将s1全部放进s2,目的是为了搞到s1栈底的元素
        if (stack2.isEmpty()) {
            //将s1中元素全部放入s2中
            while (!stack1.isEmpty()) {
                stack2.push(stack1.pop());
            }
        }
        return stack2.pop();
    }

    public boolean isEmpty() {
        return stack1.isEmpty() && stack2.isEmpty();
    }

}

2、两队列实现一栈
思路:
跟栈实现队列差不多,栈、后进先出,想办法先拿到绿的

在这里插入图片描述

添加、入栈: 元素放进queue1中
删除、出栈: 先将queue1中元素依次放进queue2中,直到queue1中只剩下一个,拿到(出队),再将queue2中元素又放回queue1中,循环往复

代码:

class MyStack {
    private Queue<Integer> queue1;
    private Queue<Integer> queue2;

    public MyStack() {
        queue1 = new ArrayDeque<>();
        queue2 = new ArrayDeque<>();
    }

    public void push(int val) {
        queue1.add(val);
    }

    public int pop() {
        while (queue1.size() > 1) {
            queue2.add(queue1.poll());
        }

        int res = queue1.remove();

        while (!queue2.isEmpty()) {
            queue1.add(queue2.poll());
        }

        return res;
    }

    //q2永远为空、q1永不为空
    public boolean isEmpty() {
        return queue1.isEmpty();
    }

}

分割线


栈的特性,“先进后出、后进先出都可以”

栈的底层实现不外乎由数组、由链表实现

所谓的先进后出、后进先出,就是你添加元素的时候,

先添加的元素最后才能拿到,后进来的元素反而第一个出去、被拿到
在这里插入图片描述
栈也就是插入删除只在栈顶进行的操作

java中的 Stack就是实现好了的栈、数组实现

其中的常用方法

  1. push(),添加元素、入栈
  2. peek(),得到栈顶元素
  3. pop(),出栈,删除并返回栈顶元素

这也是我没有写过栈跟队列的原因,我的理解实在有限,一些基础的数据结构如链表、栈、队列,多想一想结构,其实懂了的话结构很简单

我第一次学数据结构的时候,链表我也晕晕乎乎的,老师讲栈时那个后进先出一下子让那个我有了那么一点感觉了,然后看顺序表、链表,C语言基础没搞好,还是一言难尽

难道这就是选Java的接口?

队列
队列的特性,先进先出

先进来的元素第一个会被拿到

队列是可以在队头(删除)队尾(添加)被操作的东西

在这里插入图片描述

跟栈不同,java中的队列Queue只是一个接口

不要紧,我们看看其中的方法

说实话,有点懵了,学c语言版的数据结构,什么EnQueue、DeQueue
java

  1. add()、offer(),队头添加、入队
  2. remove()、poll(),队尾删除、出队
  3. element()、peek(),得到队头元素

java中没有写Queue的方法实现,但是LinkedList是实现了这个接口的

队列也就是头删、尾添、头出罢了
栈也就是尾添、尾删、尾出罢了

此外还有一种实现了Queue接口的更好用的java中的数据结构ArrayDeque -> 双端队列、循环队列

所以栈跟队列Java中已经不太提倡用了,用链表或双端队列其中一个就都可以实现了。

只要懂的实现思维不就都可以?懂?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值