leetcode 225.用队列实现栈

⭐️ 题目描述

在这里插入图片描述

🌟 leetcode链接:用队列实现栈

1️⃣ 思路和图解:

push: 入栈操作只需要往不为空的队列入数据即可,如果都为空,其中任意一个队列都可以。
在这里插入图片描述

void myStackPush(MyStack* obj, int x) {
    // 往有数据的队列中入数据(模拟入栈)
    // q1队列不为空 则往q1队列入数据
    if (!QueueIsEmpty(&obj->q1)) {
        QueuePush(&obj->q1 , x);
        // printf("%d " , QueueFront(&obj->q1));
    } else {
        QueuePush(&obj->q2 , x);
        printf("%d " , QueueBack(&obj->q2));
    }
}

pop:出栈操作需要把有数据的队列依次出数据,直到只剩下一个元素的时候,再依次把出队列的数据入到另一个队列中,在把刚才出数据的那个队列的最后一个元素删除即可。
在这里插入图片描述

int myStackPop(MyStack* obj) {
    // 两个队列为空即栈为空 不需要删除
    if (myStackEmpty(obj)) {
        return -1;
    }

    Queue *emptyQueue = &obj->q1;
    Queue *noneEmptyQueue = &obj->q2;
    if (!QueueIsEmpty(&obj->q1)) {
        noneEmptyQueue = &obj->q1;
        emptyQueue = &obj->q2;
    }

    // 把有数据的队列对头数据 push 到没有数据的队列
    // 只剩一个数据的时候 循环结束 删除仅剩的一个元素(模拟出栈)
    while (QueueSize(noneEmptyQueue) > 1) {
        QueuePush(emptyQueue , QueueFront(noneEmptyQueue));
        QueuePop(noneEmptyQueue);
    }

    // 删除仅剩的一个元素(模拟出栈)
    QueueDataType popTopElement = QueueFront(noneEmptyQueue);
    QueuePop(noneEmptyQueue);
    return popTopElement;
}

top:返回栈顶元素,把不为空的队列中队尾的数据取出即可。
在这里插入图片描述

int myStackTop(MyStack* obj) {
    // 两个队列为空即栈为空 没有栈顶元素可取
    if (myStackEmpty(obj)) {
        return -1;
    }

    // 若 q1 队列不为空 则返回 q1 队列队尾数据(模拟取栈顶元素),否则相反
    return !QueueIsEmpty(&obj->q1) ? QueueBack(&obj->q1) : QueueBack(&obj->q2);
}

empty:两个队列都为空,则栈为空。

bool myStackEmpty(MyStack* obj) {
    // 空返回真 非空返回假
    // 两个队列都为空 则栈为空
    return QueueIsEmpty(&obj->q1) && QueueIsEmpty(&obj->q2); 
}

其余接口:

//  创建两个队列 用来模拟实现栈
typedef struct {
    Queue q1;
    Queue q2;
} MyStack;

// 使用两个队列创建栈
MyStack* myStackCreate() {
    // 为栈创建空间
    MyStack* stack = (MyStack*)malloc(sizeof(MyStack));
    // 初始化两个队列
    QueueInit(&stack->q1);
    QueueInit(&stack->q2);

    return stack;
}

void myStackFree(MyStack* obj) {
    // 先销毁两个队列
    QueueDestroy(&obj->q1);
    QueueDestroy(&obj->q2);

    free(obj);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CS EXE上线主机+文件下载上传键盘记录

前言 书接上文,CobaltStrike_1_部署教程及CS制作office宏文档钓鱼教程,该篇介绍【使用CS生成对应exe木马,上线主机;对上线主机进行,文件下载,文件上传,键盘记录】。 PS:文章仅供学习…

数仓建设中最常用模型--Kimball维度建模详解

数仓建模首推书籍《数据仓库工具箱:维度建模权威指南》,本篇文章参考此书而作。文章首发公众号:五分钟学大数据,公众号后台发送“维度建模”即可获取此书籍第三版电子书 先来介绍下此书,此书是基于作者 60 多年的实际业…

SpringBoot前后端分离项目,打包、部署到服务器详细图文流程

文章目录 实施步骤一、修改配置文件地址1.修改MySQL配置2.修改Redis配置3.修改日志路径和字符集配置 二、将源码压缩并上传服务器1.上传前端文件2.上传后端文件(同上) 三、前端项目打包1.安装依赖2.项目打包 四、后端项目打包1.项目打包(jar包…

Ubuntu 20.04 LTS 安装 nvidia 驱动 + cuda 11.8 从开始到放弃!

升级 sources.list # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restri…

java的断言

断言介绍 Java的断言就是一条assert 声明,其中包含了一个布尔表达式。 断言可以被启用或者禁用,默认是禁用的。 断言被启用的情况下,执行到断言的声明,就会计算布尔表达式的值。如果表达式的值为false,那么就会抛出一…

9、架构:CLI 设计

通常大部分的程序员会更加习惯使用 CLI(Command-Line Interface 命令行界面)来辅助开发业务,包括初始化、更新、构建、发布等功能,可以获得沉浸式一站的开发体验。 在之前有一篇企业级 CLI 开发实战介绍过如何开发一款适用团队的…

阿里开业项目chat2DB-人工智能SQL分析介绍

1. chat2DB简介 1-1. 简介 ​ chat2DB是一款有开源免费的多数据库客户端工具,支持windows、mac本地安装,也支持服务器端部署,web网页访问。和传统的数据库客户端软件Navicat、DBeaver 相比Chat2DB集成了AIGC的能力,能够将自然语…

从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题

目录 1. 多态(polymorphism) 1.1 构成多态的两个条件 1.2 虚函数重写(覆盖) 1.3 协变构成多态 1.4 父虚子非虚构成多态 1.5 析构函数的重写 1.6 final 和 override 关键字(C11) 1.7 重载、覆盖、隐藏的对比 2. 抽象类&am…

11、架构:CI/CD 设计

本章内容是基于 DevOps 体系的精简版本,如果有阅读过之前 DevOps 小册的同学,可以快速掠过。 开局先放一张镇楼图,上图我在行云集团做的通用型 CI/CD 解决方案 ALL IN DOCKER,所有的操作构建与发布过程都在 Docker 中操作。 但很…

J2EE自定义mvc【框架配置及功能】

目录 一、配置步骤 二、配置框架前三步 导入相应的jar 导入相应的Class 导入xml文件 三、优化基本操作(增删改) 1、基础优化 编写实体类 编写BookDao类 优化BookDao JUnit测试 2、后台优化 3、前端优化 一、配置步骤 将框架打成jar包&…

IDEA使用教程 安装教程

16. Codota 插件 Codota 插件可以根据使用频率优先显示较常用的类和方法。然而,是否使用该插件取决于个人的偏好。有时工具只能作为参考,仍然需要依靠个人记忆来确保准确性。 17. 快速查看类和字段的注释 按下 F2 键可以快速查看某个类或字段的文档注…

从JDK源码级别剖析JVM类加载机制

1 什么是Java虚拟机 一个可执行java字节码的虚拟机进程;跨平台的是java程序,而不是java虚拟机,java虚拟机在各个操作系统是不兼容的,例如windows、linux、mac都需要安装各自版本的虚拟机,java虚拟机通过jdk实现功能。…

【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念

系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 文章目录 系列文章目录前言一、所有权(Ownership)1.1.、所有权(Ow…

【MySQL】不就是子查询

前言 今天我们来学习多表查询的下一个模块——子查询,子查询包括了标量子查询、列子查询、行子查询、表子查询,话不多说我们开始学习。 目录 前言 目录 一、子查询 1. 子查询的概念 2. 子查询语法格式 2.1 根据子查询结果不同可以分为:…

flutter聊天界面-Text富文本表情emoji、url、号码展示

flutter聊天界面-Text富文本表情emoji、url、号码展示 Text富文本表情emoji展示,主要通过实现Text.rich展示文本、emoji、自定义表情、URL等 一、Text及TextSpan Text用于显示简单样式文本 TextSpan它代表文本的一个“片段”,不同“片段”可按照不同的…

Matlab画等构造图

clc;clear;close all; data xlsread(TOPBRENT等T0构造.xlsx); x data(:,1) xmax max(x); xmin min(x); y data(:,2) ymax max(y); ymin min(y); z data(:,3); N 45; …

IDEA使用插件绘制UML类图+PlantUML语法讲解

安装 IDEA安装插件 安装完插件记得重启一下IDEA 安装Graphviz(亲测win11可以使用) 安装完插件之后,还需要安装Graphviz才可以渲染图形。 Graphviz安装包下载地址 安装过程很简单,直接双击或者管理员身份运行即可,注…

Docker中部署Redis集群与部署微服务项目的详细过程

目录 一、使用Docker部署的好处二、Docker 与 Kubernetes 对比三、Redis集群部署实战四、Spring Boot项目 打包镜像?小结 一、使用Docker部署的好处 Docker的好处在于:在不同实例上运行相同的容器 Docker的五大优点: 持续部署与测试、多云服务平台支…

微信小程序开发与应用——字体样式设置

要求:设置字体样式。 1、打开微信开发者工具,创建一个小程序,如下: 2、设置小程序的项目名称和路径,并选择开发语言为JavaScript,如下: 3、小程序的主体部分由三个文件组成,且都要…

VS2019+Qt5.15 在线显示百度地图

1.Qt5.15编译程序需要选择mscv2019 Release版本 2.需要到百度地图开发平台注册并获取到开发者key 3.显示地图是JS与Qt的交互过程&#xff0c;显示地图的html文件&#xff1a; <!DOCTYPE html> <html><head> <meta name"viewport" content&q…