栈和队列

本文介绍了栈和队列的基本概念,包括它们的后进先出(LIFO)和先进先出(FIFO)特性,并通过代码展示了如何使用两个栈实现队列以及如何使用队列实现栈。作者还分享了在LeetCode上解决相关问题的思路和代码实现。
摘要由CSDN通过智能技术生成

序言

hello,大家好,今天我们聊一聊栈和队列,大二学数据结构时候,第一次接触到栈和队列,不知不觉到现在两年时间了,不得不感叹一句时间如流水,青春不回头啊~

栈和队列的概念

栈,是一种后进先出的数据结构,上图看一下

可以看到对于先进来的元素是压入栈底的,后进来的元素则放到栈顶,出栈时先出栈顶元素,这样就可以构成后进先出的数据结构了。

队列

队列,是一种先进先出的数据结构,上图~

将1,2,3元素依次入队,队头元素为1,队尾元素为3,出队时先出队头元素,对于后入队的元素将其放置到队尾即可。

用栈实现队列

这道题是leetcode上的原题,我们一起来做一下。

思路分析

要求用栈数据结构来实现队列,也就是说通过后进先出的数据结构实现先进先出。对于元素1,2,3,出队的顺序是1,2,3,出栈的顺序是3,2,1,那么再将出栈的元素入栈,栈中元素就是3,2,1,再出栈的话结果就和最开始出队的顺序一样了,为1,2,3,由此我们可以用两个栈来实现队列。

代码

class MyQueue {
    private Stack<Integer> stack1;
    private Stack<Integer> stack2;

    public MyQueue() {
        //栈1
        stack1 = new Stack<Integer>();
        //栈2
        stack2 = new Stack<Integer>();
    }

    public void push(int x) {
        //先将元素存入栈1
        stack1.push(x);
    }


    public int pop() {
        if (stack1.isEmpty() && stack2.isEmpty()) {
            return -1;
        }
        if (stack2.isEmpty()) {
            //将栈1中的元素重新压栈到栈2,调换顺序
            while (!stack1.isEmpty()) {
                stack2.push(stack1.pop());
            }
        }
        return stack2.pop();
    }

    public int peek() {
        if (stack1.isEmpty() && stack2.isEmpty()) {
            return -1;
        }
        if (stack2.isEmpty()) {
            while (!stack1.isEmpty()) {
                stack2.push(stack1.pop());
            }
        }
        return stack2.peek();
    }

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

用队列实现栈

这道题也是leetcode上的原题

思路分析

和上题一样,我们先假设已有元素123,出栈的顺序是321,出队的顺序是123,和上题不同的是即使我们让其再入队再出队顺序依旧是123,所以我们需要换一种思路,我们可以用一个队列来保存之前存放的元素,另一个队列存放刚入队的元素,然后将第一个队列的元素添加到第二个队列当中,让它的顺序颠倒,出队时也就可以达到321的效果了。

代码

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

    public MyStack() {
        //队列1
        queue1 = new LinkedList<>();
        //队列2
        queue2 = new LinkedList<>();
    }

    public void push(int x) {
        queue1.offer(x);
        //队列2的元素都添加到队列1,反转顺序
        while (!queue2.isEmpty()) {
            queue1.offer(queue2.poll());
        }
        //交换1,2的位置,让队列1中的元素使用为null
        Queue<Integer> temp = queue1;
        queue1 = queue2;
        queue2 = temp;
    }

    public int pop() {
        if (empty()) {
            return -1;
        }
        return queue2.poll();
    }

    public int top() {
        if (empty()) {
            return -1;
        }
        return queue2.peek();
    }

    public boolean empty() {
        return queue2.isEmpty();
    }
}

结尾

最近疫情有严重起来了,希望大家都能保护好自己o( ̄︶ ̄)o

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

guojunjiang12345

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

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

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

打赏作者

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

抵扣说明:

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

余额充值