第四期:栈与队列的交换游戏

简介: 第四期:栈与队列的交换游戏

PS:每道题解题方法不唯一,欢迎讨论!每道题后都有解析帮助你分析做题,答案在最下面,关注博主每天持续更新。


1. 用队列实现栈

题目描述

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。

实现 MyStack 类:

void push(int x) 将元素 x 压入栈顶。

int pop() 移除并返回栈顶元素。

int peek() 返回栈顶元素。

boolean empty() 如果栈是空的,返回 true ;否则,返回 false

示例

请设计出可以满足上述要求的代码

解析

做这道题可能比较绕,为了满足栈后入先出,在使用队列实现栈时,应满足队列前端的元素是最后入栈的元素,我们可以使用两个队列q1,q2实现栈的操作。

当实现入栈时,将元素放入有元素的队列中,如果两个队列都为空,我们可以放入任意一个,这里我们把它放入q1中。

当实现出队列时,我们可以把有元素的队列元素依次放入到另一个队列中,当这个队列就剩一个元素,就不要在放了,这个元素就是要出的元素。

重复以上操作,便用队列实现了栈。


2. 用栈实现队列

题目描述

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty)。

实现 MyQueue 类:


void push(int x) 将元素 x 推到队列的末尾

int pop() 从队列的开头移除并返回元素

int peek() 返回队列开头的元素

boolean empty() 如果队列为空,返回 true ;否则,返回 false

示例

请设计出可以满足上述要求的代码

解析

如果第一次看到这题,你可能会有点蒙,但这很正常,这个题其实也不难。为了满足队列的先入先出,我们可以使用两个栈,一个放一个出,s1,s2。

当放元素的时候,可以放入任意栈,我们这里放入s1,s2实现出。

当出元素的时候,如果s2中没有元素,我们将s1中的元素全部放入s2,这样元素便倒置,再次出栈的时候就刚好对应上了先入先出,如果s2中有元素,我们便出s2的元素。

重复以上操作。


3. 答案

3.1 用队列实现栈

class MyStack {
    public Queue<Integer> q1;
    public Queue<Integer> q2;
    public MyStack() {
        q1 = new LinkedList<>();
        q2 = new LinkedList<>();
    }
    //放
    public void push(int x) {
        if(!q1.isEmpty()){
            q1.offer(x);
        }else if(!q2.isEmpty()){
            q2.offer(x);
        }else{
            q1.offer(x);
        }
    }
    //出
    public int pop() {
        if(empty()){
            return -1;
        }
        if(!q1.isEmpty()){
            int len = q1.size();
            for(int i = 0; i < len - 1; i++){
                int x = q1.poll();
                q2.offer(x);
            }
            return q1.poll();
        }
        if(!q2.isEmpty()){
            int len = q2.size();
            for(int i = 0; i < len - 1; i++){
                int x = q2.poll();
                q1.offer(x);
            }
            return q2.poll();
        }
        return -1;
    }
    public int top() {
        if(empty()){
            return -1;
        }
        if(!q1.isEmpty()){
            int x = 0;
            int len = q1.size();
            for(int i = 0; i < len; i++){
                x = q1.poll();
                q2.offer(x);
            }
            return x;
        }
        if(!q2.isEmpty()){
            int x = 0;
            int len = q2.size();
            for(int i = 0; i < len; i++){
                x = q2.poll();
                q1.offer(x);
            }
            return x;
        }
        return -1;
    }
    public boolean empty() {
        return (q1.size() == 0 && q2.size() == 0);
    }
}


3.2 用栈实现队列

class MyQueue {
    public Stack<Integer> s1;
    public Stack<Integer> s2;
    public MyQueue() {
        s1 = new Stack<>();
        s2 = new Stack<>();
    }
    public void push(int x) {
        s1.push(x);
    }
    public int pop() {
        if(empty()){
            return -1;
        }
        if(s2.isEmpty()){
            while(!s1.isEmpty()){
                int x = s1.pop();
                s2.push(x);
            }            
        }
        return s2.pop();
    }
    public int peek() {
        if(empty()){
            return -1;
        }
        if(s2.isEmpty()){
            while(!s1.isEmpty()){
                int x = s1.pop();
                s2.push(x);
            }            
        }
        return s2.peek();
    }
    public boolean empty() {
        return s1.isEmpty() && s2.isEmpty();
    }
}
目录
相关文章
|
5天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
64 9
|
2天前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。
|
4天前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
26 4
|
8天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
21天前
数据结构(栈与列队)
数据结构(栈与列队)
16 1
|
26天前
|
存储 JavaScript 前端开发
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
61 1
|
22天前
【数据结构】-- 栈和队列
【数据结构】-- 栈和队列
13 0
|
27天前
探索数据结构:队列的的实现与应用
探索数据结构:队列的的实现与应用
|
27天前
探索顺序结构:栈的实现方式
探索顺序结构:栈的实现方式
|
27天前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
26 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器