【力扣-225】用队列实现栈

news2025/6/19 15:58:48

🖊作者 : D. Star.
📘专栏 : 数据结构
😆今日小tips : 有些家里可能会有两个同样名字的 WiFi,而其中一个名字的最后有个 5G,那么,这个 5G 和常说的 5G 信号是一回事吗?并不是,无线路由器上的 5G 指的是 WiFi 的工作频段,手机上的 5G 指的是第五代蜂窝网络技术标准。与普通的 2.4G 频段相比,无线路由器上的 5G 频段的频宽更宽,如果宽带够快,那么就可以有更好的网络体验。但是 5G 频段的覆盖范围要比 2.4G 频段小一些,穿墙能力也要弱一些。

请添加图片描述

文章目录

  • 🔎题目链接:
  • 🔎题目:
  • 🔎分块解释:
    • ✔队列函数:
    • ✔用队列实现栈:
  • 🔎代码详情:
    • 家人们,点个![请添加图片描述](https://img-blog.csdnimg.cn/11dae7d2dd1b46b2b021edaccee67cf1.jpeg)再走呗~

🔎题目链接:

【力扣-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

🔎分块解释:

✔队列函数:

typedef int QDataType;

typedef struct QueueNode
{
    QDataType data;
    struct QueueNode* next;
}QNode;

typedef struct Queue
{
    QNode* head;
    QNode* tail;
    int size;
}Queue;

//初始化
void InitQueue(Queue* pq)
{
    assert(pq);

    pq->head = NULL;
    pq->tail = NULL;
    pq->size = 0;
}

//销毁
void DestroyQueue(Queue* pq)
{
    assert(pq);
    QNode* cur = pq->head;
    while (cur)
    {
        QNode* del = cur;
        cur = cur->next;
        free(del);
        del = NULL;
    }
    pq->head = pq->tail = NULL;
    pq->size = 0;
}

//判断是否为空
bool EmptyQueue(Queue* pq)
{
    assert(pq);

    return pq->head == NULL && pq->tail == NULL;
}

//入队
void PushQueue(Queue* pq, QDataType x)
{
    assert(pq);
    QNode* newNode = (QNode*)malloc(sizeof(QNode));
    if (newNode == NULL)
    {
        perror("malloc fail");
        exit(-1);
    }
    else
    {
        newNode->data = x;
        newNode->next = NULL;
    }

    if (pq->tail == NULL)
    {
        pq->head = pq->tail = newNode;
    }
    else
    {
        pq->tail->next = newNode;
        pq->tail = newNode;
    }
    pq->size++;
}

//出队
void PopQueue(Queue* pq)
{
    assert(pq);
    assert(!EmptyQueue(pq));

    if (pq->head != pq->tail)
    {
        QNode* del = pq->head;
        pq->head = pq->head->next;
        free(del);
    }
    else
    {
        free(pq->head);
        pq->head = pq->tail = NULL;
    }

    pq->size--;
}

//取头
QDataType QueueFront(Queue* pq)
{
    assert(pq);
    assert(!EmptyQueue(pq));

    return pq->head->data;
}

//取尾
QDataType QueueBack(Queue* pq)
{
    assert(pq);
    assert(!EmptyQueue(pq));

    return pq->tail->data;
}

//队列的长度
int SizeQueue(Queue* pq)
{
    assert(pq);
    return pq->size;
}

✔用队列实现栈:

typedef struct {
    Queue q1;
    Queue q2;
} MyStack;
MyStack* myStackCreate() {
    MyStack* obj = (MyStack*)malloc(sizeof(MyStack));
    if (obj == NULL)
    {
        perror("malloc fail");
        exit(-1);
    }
    InitQueue(&obj->q1);
    InitQueue(&obj->q2);

    return obj;
}

//将元素 x 压入栈顶
void myStackPush(MyStack* obj, int x) {
    assert(obj);
    //法一:
    Queue* empty = &obj->q1;
    Queue* noempty = &obj->q2;
    if (!EmptyQueue(&obj->q1)) {
        empty = &obj->q2;
        noempty = &obj->q1;
    }

    PushQueue(noempty, x);

    //法二:
        // if(!EmptyQueue(&obj->q1))
        // {
        //    PushQueue(&obj->q1,x);
        // }
        // else
        // {
        //    PushQueue(&obj->q2,x);
        // }
}

//移除并返回栈顶元素。
int myStackPop(MyStack* obj) {
    assert(obj);

    Queue* empty = &obj->q1;
    Queue* noempty = &obj->q2;
    if (!EmptyQueue(&obj->q1)) {
        empty = &obj->q2;
        noempty = &obj->q1;
    }

    //将不为空的n-1个移到为空中
    while (noempty->size > 1) {
        PushQueue(empty, QueueFront(noempty));
        PopQueue(noempty);
    }
    int ret = QueueFront(noempty);
    PopQueue(noempty);

    return ret;
}

//返回栈顶元素。
int myStackTop(MyStack* obj) {
    assert(obj);
    //法一:
        // //判断哪一个队列为空
        // Queue* empty = &obj->q1;
        // Queue* noempty = &obj->q2;
        // if(!EmptyQueue(&obj->q1))
        // {
        //     empty = &obj->q2;
        //     noempty = &obj->q1;
        // }

        // //将不为空的n-1个移到为空中
        // while(noempty->size >1){
        //     PushQueue(empty,QueueFront(noempty));
        //     PopQueue(noempty);
        // }
        // int ret = QueueFront(noempty);
        // PushQueue(empty,ret);
        // PopQueue(noempty);

        // return ret;
        
    //法二:
    if (!EmptyQueue(&obj->q1))
    {
        return QueueBack(&obj->q1);
    }
    else
    {
        return QueueBack(&obj->q2);
    }
}

bool myStackEmpty(MyStack* obj) {
    assert(obj);
    return EmptyQueue(&obj->q1) && EmptyQueue(&obj->q2);
}

void myStackFree(MyStack* obj) {
    assert(obj);
    DestroyQueue(&obj->q1);
    DestroyQueue(&obj->q2);
    free(obj);
}

🔎代码详情:

typedef int QDataType;

typedef struct QueueNode
{
    QDataType data;
    struct QueueNode* next;
}QNode;

typedef struct Queue
{
    QNode* head;
    QNode* tail;
    int size;
}Queue;

typedef struct {
    Queue q1;
    Queue q2;
} MyStack;

//初始化
void InitQueue(Queue* pq)
{
    assert(pq);

    pq->head = NULL;
    pq->tail = NULL;
    pq->size = 0;
}

//销毁
void DestroyQueue(Queue* pq)
{
    assert(pq);
    QNode* cur = pq->head;
    while (cur)
    {
        QNode* del = cur;
        cur = cur->next;
        free(del);
        del = NULL;
    }
    pq->head = pq->tail = NULL;
    pq->size = 0;
}

//判断是否为空
bool EmptyQueue(Queue* pq)
{
    assert(pq);

    return pq->head == NULL && pq->tail == NULL;
}

//入队
void PushQueue(Queue* pq, QDataType x)
{
    assert(pq);
    QNode* newNode = (QNode*)malloc(sizeof(QNode));
    if (newNode == NULL)
    {
        perror("malloc fail");
        exit(-1);
    }
    else
    {
        newNode->data = x;
        newNode->next = NULL;
    }

    if (pq->tail == NULL)
    {
        pq->head = pq->tail = newNode;
    }
    else
    {
        pq->tail->next = newNode;
        pq->tail = newNode;
    }
    pq->size++;
}

//出队
void PopQueue(Queue* pq)
{
    assert(pq);
    assert(!EmptyQueue(pq));

    if (pq->head != pq->tail)
    {
        QNode* del = pq->head;
        pq->head = pq->head->next;
        free(del);
    }
    else
    {
        free(pq->head);
        pq->head = pq->tail = NULL;
    }

    pq->size--;
}

//取头
QDataType QueueFront(Queue* pq)
{
    assert(pq);
    assert(!EmptyQueue(pq));

    return pq->head->data;
}

//取尾
QDataType QueueBack(Queue* pq)
{
    assert(pq);
    assert(!EmptyQueue(pq));

    return pq->tail->data;
}

//队列的长度
int SizeQueue(Queue* pq)
{
    assert(pq);
    return pq->size;
}

MyStack* myStackCreate() {
    MyStack* obj = (MyStack*)malloc(sizeof(MyStack));
    if (obj == NULL)
    {
        perror("malloc fail");
        exit(-1);
    }
    InitQueue(&obj->q1);
    InitQueue(&obj->q2);

    return obj;
}

//将元素 x 压入栈顶
void myStackPush(MyStack* obj, int x) {
    assert(obj);
    //法一:
    Queue* empty = &obj->q1;
    Queue* noempty = &obj->q2;
    if (!EmptyQueue(&obj->q1)) {
        empty = &obj->q2;
        noempty = &obj->q1;
    }

    PushQueue(noempty, x);

    //法二:
        // if(!EmptyQueue(&obj->q1))
        // {
        //    PushQueue(&obj->q1,x);
        // }
        // else
        // {
        //    PushQueue(&obj->q2,x);
        // }
}

//移除并返回栈顶元素。
int myStackPop(MyStack* obj) {
    assert(obj);

    Queue* empty = &obj->q1;
    Queue* noempty = &obj->q2;
    if (!EmptyQueue(&obj->q1)) {
        empty = &obj->q2;
        noempty = &obj->q1;
    }

    //将不为空的n-1个移到为空中
    while (noempty->size > 1) {
        PushQueue(empty, QueueFront(noempty));
        PopQueue(noempty);
    }
    int ret = QueueFront(noempty);
    PopQueue(noempty);

    return ret;
}

//返回栈顶元素。
int myStackTop(MyStack* obj) {
    assert(obj);
    //法一:
        // //判断哪一个队列为空
        // Queue* empty = &obj->q1;
        // Queue* noempty = &obj->q2;
        // if(!EmptyQueue(&obj->q1))
        // {
        //     empty = &obj->q2;
        //     noempty = &obj->q1;
        // }

        // //将不为空的n-1个移到为空中
        // while(noempty->size >1){
        //     PushQueue(empty,QueueFront(noempty));
        //     PopQueue(noempty);
        // }
        // int ret = QueueFront(noempty);
        // PushQueue(empty,ret);
        // PopQueue(noempty);

        // return ret;
        
    //法二:
    if (!EmptyQueue(&obj->q1))
    {
        return QueueBack(&obj->q1);
    }
    else
    {
        return QueueBack(&obj->q2);
    }
}

bool myStackEmpty(MyStack* obj) {
    assert(obj);
    return EmptyQueue(&obj->q1) && EmptyQueue(&obj->q2);
}

void myStackFree(MyStack* obj) {
    assert(obj);
    DestroyQueue(&obj->q1);
    DestroyQueue(&obj->q2);
    free(obj);
}

感谢家人的阅读,若有不准确的地方 欢迎在评论区指正!

家人们,点个请添加图片描述再走呗~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/499012.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

研报精选230507

目录 【行业230507山西证券】煤炭行业周报:港口煤价趋稳,静待经济信心恢复与迎峰度夏双至 【行业230507山西证券】农业行业周报:建议逢低布局经营稳健和低PB的养殖股 【行业230507头豹研究院】2023年中国无源物联网行业词条报告 【个股230507…

运算放大器 - 笔记 02 -恒流源

恒流源 / 电流源 一、方案一二、方案二三、方案三四、方案四 前言:最近在学习运放,三极管,二极管,场效应管等器件的组合电路。捡起了以前的模电知识,写下笔记,以防再度忘记。 本文使用Multisim仿真软件进行…

MySQL---约束(主键约束,自增长约束,非空约束,唯一约束,默认约束、零填充约束)

1. 主键约束 MySQL主键约束是一个列或者多个列的组合,其值能唯一地标识表中的每一行,方便在RDBMS中 尽快的找到某一行。 主键约束相当于 唯一约束 非空约束 的组合,主键约束列不允许重复,也不允许出现空值。 每个表最多只允许一个主键 …

Linux 挂载磁盘教程,Linux系统分区及磁盘挂载

Linux 挂载磁盘教程,Linux系统分区及磁盘挂载 说明:以下教程是以未安装任何程序及无数据的数据盘基础上编写 如已安装程序或数据盘含有数据切勿使用此教程 本文中的磁盘/dev/sdb为笔者测试服务器上的命名,在您的服务器中可能是/dev/xdb、/dev…

【C++入门】引用

👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&#x1…

npm私有库(nexus)-安装nexus

注:安装 nexus(需要先安装 Java jdk) 1、上传软件包到服务器并解压 链接:https://pan.baidu.com/s/1NgpIbTaH4xV-HceyTUuxVA 提取码:vs51 tar -xvf nexus-3.19.1-01-unix.tar.gz 2、修改默认端口,并开启端口 firewall-cmd --pe…

windows和Linux系统配置静态ip方法

为什么要配置静态IP 配置静态IP地址可以确保设备始终具有相同的IP地址,这对于需要远程访问、网络管理和安全性很重要。与动态IP地址不同,静态IP地址不会随着时间而改变,因此它允许管理员轻松地识别特定设备并在网络上进行更精细的控制。另外…

02- 目标检测基础知识及优化思路汇总 (目标检测)

要点: 参考综述:深度学习目标检测最全综述 - 爱码网参考表达:https://www.cnblogs.com/xjxy/p/13588772.html 一 发展历程 分类网络是目标检测的基础,必须熟练掌握。 1.1 传统算法 V.J Detector 19年前,P. Viola 和 …

操作系统——文件管理

0.关注博主有更多知识 操作系统入门知识合集 目录 9.1文件系统概念 思考题: 9.2文件的物理结构 思考题: 9.3文件存储和目录 9.1文件系统概念 文件的定义: 文件是计算机信息存取的一种重要组织形式,文件由若干信息项有序构…

多项式时间验证与NP完全性

多项式时间的验证 对语言的“验证”算法: 验证与求解花费时间一样长:最短路径问题的一个实例的证书很容易能在多项式时间内被验证。实际上最短路径问题本身可以在多项式时间内求解。因此,根据指定的证书来验证与从头开始求解这个问题的时间…

Docker安装常用软件-Nacos

一、单机部署 官方网站:什么是 Nacos 1、下载最新nacos镜像 docker pull nacos/nacos-server 2、新建映射文件夹 --nacos/conf/application.properties --nacos/logs --nacos/sql ①application文件 # # Copyright 1999-2021 Alibaba Group Holding Ltd. #…

Ajax -- from表单与模板引擎

1. from表单的基本使用 1.1 什么是表单 表单在网页中主要负责数据采集功能。HTML中的标签,就是用于采集用户输入的信息,并通过标签的提交操作,把采集到的信息提交到服务器端进行处理。 1.2 表单的组成部分 表单由三个基本部分组成&#…

MySQL基础(七)单行函数

1. 函数的理解 1.1 什么是函数 函数在计算机语言的使用中贯穿始终,函数的作用是什么呢?它可以把我们经常使用的代码封装起来,需要的时候直接调用即可。这样既提高了代码效率,又提高了可维护性。在 SQL 中我们也可以使用函数对检…

GUN C编译器拓展语法学习笔记(一)GNU C特殊语法部分详解

GNU C特殊语法部分详解 一、指定初始化1、数组初始化2、指定初始化结构体成员3、指定初始化的好处 二、宏构造利器:语句表达式1、表达式、语句和代码块2、语句表达式3、宏定义中的语句表达式 三、typeof 与container_of 宏1、typeof 关键字宏2、Linux内核中的contai…

提示词的天花板来了- ChatGPT 指导学习知识点

https://github.com/JushBJJ/Mr.-Ranedeer-AI-Tutor/ 访问 ChatGPT网站选择 GPT-4(或更高版本)模型将 Mr_Ranedeer.json 的内容复制粘贴到 ChatGPT让 Mr. Ranedeer 带领您完成配置过程 开始学习吧! 支持以下命令: /feedback&…

Golang每日一练(leetDay0055) 最长子串、相交链表

目录 159.至多包含两个不同字符的最长子串 Longest-substring-with-at-most-two-distinct-characters 🌟🌟 160. 相交链表 Intersection-of-two-linked-lists 🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 …

【C++初阶】类与对象(中)

目录 一.类的6个默认成员函数二、构造函数特性 三、析构函数概念特性 四、拷贝构造函数概念特性 五、赋值运算符重载5.1 运算符重载5.2 赋值运算符重载 一.类的6个默认成员函数 在C中,一个类中并没有实现任何属性和方法,被叫做空类,但是一个…

《Linux 内核设计与实现》05. 系统调用

文章目录 内核通信API、POSIX、C库 系统调用系统调用号系统调用的性能 系统调用处理程序指定恰当的系统调用参数传递 系统调用的实现实现系统调用参数验证 系统调用上下文绑定一个系统调用的最后步骤从用户空间绯闻系统调用 内核通信 系统调用在用户空间进程和硬件设备之间添加…

【疯狂造轮子-iOS】JSON转Model系列之一

1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗忘。这段时间准备自己造一些轮子,主要目的还是为了提升自身实力,总不能一遇到问题就Google 。 之前写i博客园客户端的时候&#xff0…

借助PLC-Recorder,西门子PLC S7-200SMART实现2ms周期采集的方法(带时间戳采集)

目录 1、测试条件 2、测试结论 3、PLC的发送程序 4、PLC-Recorder侧的通讯设置 5、PLC-Recorder的通道配置 6、PLC-Recorder的变量配置 7、记录数据的情况 8、再说时间戳 9、小结 高速数据采集要保证速度,也要保证时刻的准确性。在windows系统里&#xff0…