力扣 225题 用队列实现栈 记录

题目描述

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

实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
 
注意:
你只能使用队列的标准操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。
你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

示例:

输入:
["MyStack", "push", "push", "top", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 2, 2, false]

解释:
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False

思路

用单个队列实现了栈的行为。栈是一种后入先出(LIFO)的数据结构,通常支持 push、pop、top 和 empty 操作。在这个实现中,通过对队列的操作,模拟了栈的行为。

类定义和构造函数

class MyStack {
public:
    std::queue<int> que;
    MyStack() {
    }

MyStack 类中定义了一个公有成员 que,类型为 std::queue,用于存储栈中的元素。
构造函数 MyStack() 是一个空构造函数,不进行任何操作。队列 que 的初始化由其默认构造函数处理。

push()

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

push(int x) 方法直接将元素 x 加入队列的尾部。在栈的行为中,这将是最后一个被弹出的元素,符合后入先出的特性。

pop()

    int pop() {
        for(int i = 0; i < que.size() - 1; i++){
            que.push(que.front());
            que.pop();
        }
        int result = que.front();
        que.pop();
        return result;
    }

pop() 方法移除并返回栈顶元素。为了达到这个目的,首先将队列前面的元素(除最后一个元素外)依次出队并重新入队到队列尾部。这样,原本的最后一个元素(栈顶元素)就移到了队列的前端,可以通过 que.pop() 直接移除并返回。
循环 for(int i = 0; i < que.size() - 1; i++) 确保除了最后一个元素,其他所有元素都被重新排列。

top()

    int top() {
        return que.back();
    }

top() 方法返回栈顶元素的值,但不移除它。由于队列的 back() 方法可以直接访问队尾元素,这里的队尾元素正是最后入栈的元素,因此可以直接返回。

empty()

    bool empty() {
        return que.empty();
    }

empty() 方法检查栈(队列)是否为空。如果队列为空,则栈也为空,返回 true;否则返回 false。

完整代码

#include<stack>
#include<queue>
#include<iostream>

class MyStack {
public:
    std::queue<int> que;
    MyStack() {
        
    }
    
    void push(int x) {
        que.push(x);
    }
    
    int pop() {
        for(int i = 0; i < que.size() - 1; i++){
            que.push(que.front());
            que.pop();
        }
        int result = que.front();
        que.pop();
        return result;
    }
    
    int top() {
        return que.back();
    }
    
    bool empty() {
        return que.empty();
    }
};

int main() {
    MyStack myStack;
    myStack.push(1);
    myStack.push(2);
    std::cout << "Top: " << myStack.top() << std::endl;  // 返回 2
    std::cout << "Pop: " << myStack.pop() << std::endl;  // 返回 2
    std::cout << "Empty: " << (myStack.empty() ? "true" : "false") << std::endl;  // 返回 false

    return 0;
}

时间复杂度: pop为O(n),其他为O(1)
空间复杂度: O(n)

相关推荐

  1. 225 队列实现 记录

    2024-07-12 20:58:05       21 阅读
  2. 225. 队列实现

    2024-07-12 20:58:05       46 阅读
  3. [题解]225. 队列实现

    2024-07-12 20:58:05       27 阅读
  4. 每日一 --- 实现队列[][Go]

    2024-07-12 20:58:05       34 阅读
  5. 232. 实现队列

    2024-07-12 20:58:05       46 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 20:58:05       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 20:58:05       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 20:58:05       57 阅读
  4. Python语言-面向对象

    2024-07-12 20:58:05       68 阅读

热门阅读

  1. python爬虫js逆向入门

    2024-07-12 20:58:05       25 阅读
  2. vue3+ts 引入 json-editor-vue3 报错

    2024-07-12 20:58:05       19 阅读
  3. jar服务注册为windows的服务

    2024-07-12 20:58:05       14 阅读
  4. C++:创建线程

    2024-07-12 20:58:05       26 阅读
  5. python 知识点累积

    2024-07-12 20:58:05       21 阅读
  6. C语言——循环结构:while、do...while、for

    2024-07-12 20:58:05       22 阅读
  7. 简单有效防止CDN被盗刷流量

    2024-07-12 20:58:05       17 阅读
  8. Linux 命令个人学习笔记

    2024-07-12 20:58:05       18 阅读
  9. SpringBoot实现Read Through模式

    2024-07-12 20:58:05       19 阅读