代码随想录算法训练营第10天| 232.用栈实现队列、225. 用队列实现栈

232.用栈实现队列

题目链接:232. 用栈实现队列 - 力扣(LeetCode)
文档讲解:代码随想录 (programmercarl.com)
视频讲解:栈的基本操作! | LeetCode:232.用栈实现队列_哔哩哔哩_bilibili
解题思路:

class MyQueue {

    Stack<Integer> stackin;
    Stack<Integer> stackout;
    //用两个栈来模拟队列的操作
    public MyQueue() {
        stackin = new Stack<>();//进栈
        stackout = new Stack<>();//出栈
    }

    public void push(int x) {
        stackin.push(x);
        //将元素放入进栈
    }

    public int pop() {
        if (stackout.empty()) {
            while (!stackin.empty()) {
                stackout.push(stackin.pop());
            }
        }
        return stackout.pop();
    }

    public int peek() {
        int res = this.pop();
        stackout.push(res);
        return res;
    }

    public boolean empty() {
        return stackin.isEmpty() && stackout.isEmpty();
    }
}


时间复杂度:push和empty为O(1), pop和peek为O(n)
该题总结:其实我还没学数据结构,写起来有点吃力,主要是不太清楚栈和队列的逻辑,以及他们在java中怎么实现以及函数的使用,写完这道题才算是对栈和队列有了初步的了解。

225. 用队列实现栈

题目链接:225. 用队列实现栈 - 力扣(LeetCode)
文档讲解:代码随想录 (programmercarl.com)
视频讲解:队列的基本操作! | LeetCode:225. 用队列实现栈_哔哩哔哩_bilibili
解题思路:

class MyStack {

   Queue<Integer> que;

    public MyStack() {
        que = new LinkedList<>();
    }

    public void push(int x) {
        que.add(x);
    }

    public int pop() {
        reposition();
        return que.poll();
    }

    public int top() {
        reposition();
        int result = que.poll();
        que.add(result);
        return result;
    }

    public boolean empty() {
        return que.isEmpty();
    }
    
    public void reposition() {
        int size = que.size() - 1;
        while (size-- != 0) {
            que.add(que.poll());
        }
    }
}


时间复杂度:pop为O(n),其他为O(1)
该题总结:这道题在top的pop两个函数中我的逻辑并不是很清晰,两个reposition使用地不好,不清楚他们在力扣上究竟是独立实现的还是互相影响的,这个问题影响了我对这道题的作答,其实有更好的办法,就是在push方法中就将每个元素排好序,后面就不需要用这种逻辑不清的reposition函数了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值