leetcode:用队列实现栈(后进先出)
题目描述
题目链接:225. 用队列实现栈 - 力扣(LeetCode)

题目分析
我们先把之前写的队列实现代码搬过来
用队列实现栈最主要的是实现栈后进先出的特点,而队列的特点是先进先出,那么我们可以用两个队列来实现
- 一个队列存数据
- 另一个队列在出数据的时候导数据

具体的接口有下面几个
初始化
我们先创建一个结构体来封装两个队列

初始化两个队列

销毁
我们要分析清楚这个结构,pst存q1,q2两个队列,需要先销毁q1和q2,然后释放pst


入栈
入栈我们入到不为空的队列中去,当q1不为空则入队列q1,否则入队列q2

出栈
出栈的时候就需要导数据了,比如数据都在q1中,q2为空,这时我们先判断空队列是哪一个,然后将非空队列前n-1个数据导入到空队列中,最后留一个数据就是栈顶数据,也是队列的队头数据,可以用QFront接口,先用top保存这个数据,接着pop掉这个数据,返回top

判空

返回栈顶元素
直接取不为空队列的队尾数据

代码示例
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
//创建
typedef int QDataType;
typedef struct QueueNode
{QDataType val;struct QueueNode* next;
}QNode;typedef struct Queue
{QNode* phead;QNode* ptail;int size;
}Queue;
//把队列的头尾封装在一个结构体中//初始化
void QInit(Queue* pq);
//销毁
void QDestroy(Queue* pq);//入队列
void QPush(Queue* pq, QDataType x);
//出队列
void QPop(Queue* pq);
//取队头数据
QDataType QFront(Queue* pq);
//取队尾数据
QDataType QBack(Queue* pq);
//判空
bool QEmpty(Queue* pq);
//返回队列有效元素个数
int QSize(Queue* pq);//初始化
void QInit(Queue* pq)
{assert(pq);pq->phead = pq->ptail = NULL;pq->size = 0;
}
//销毁
void QDestroy(Queue* pq)
{assert(pq);QNode* cur = pq->phead;while (cur){QNode* next = cur->next;free(cur);cur = next;}pq->phead = pq->ptail = NULL;pq->size = 0;
}
//入队列
void QPush(Queue* pq, QDataType x)
{assert(pq);//创建newnodeQNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");return;}newnode->val = x;newnode->next = NULL;if (pq->ptail == NULL){pq->phead = pq->ptail = newnode;}else{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}
//出队列
void QPop(Queue* pq)
{assert(pq);assert(pq->phead);QNode* del = pq->phead;pq->phead = pq->phead->next;free(del);del = NULL;if (pq->phead == NULL){pq->ptail = NULL;//防止ptail成为野指针}pq->size--;
}
//取队头数据
QDataType QFront(Queue* pq)
{assert(pq);assert(pq->phead);return pq->phead->val;
}
//取队尾数据
QDataType QBack(Queue* pq)
{assert(pq);assert(pq->ptail);return pq->ptail->val;
}
//判空
bool QEmpty(Queue* pq)
{assert(pq);return pq->phead == NULL;
}
//返回队列有效元素个数
int QSize(Queue* pq)
{assert(pq);return pq->size;
}typedef struct MyStack{Queue q1;Queue q2;
} MyStack;MyStack* myStackCreate() {MyStack* pst = (MyStack*)malloc(sizeof(MyStack));QInit(&(pst->q1));QInit(&(pst->q2));return pst;
}void myStackPush(MyStack* obj, int x) {if (!QEmpty(&(obj->q1))){QPush(&(obj->q1), x);}else{QPush(&(obj->q2), x);}
}int myStackPop(MyStack* obj) {Queue* empty = &(obj->q1);Queue* nonempty = &(obj->q2);if (!QEmpty(&(obj->q1))){empty = &(obj->q2);nonempty = &(obj->q1);}while (QSize(nonempty) > 1){QPush(empty, QFront(nonempty));QPop(nonempty);}int top = QFront(nonempty);QPop(nonempty);return top;}int myStackTop(MyStack* obj) {if (!QEmpty(&(obj->q1))){return QBack(&(obj->q1));}else{return QBack(&(obj->q2));}
}bool myStackEmpty(MyStack* obj) {return QEmpty(&(obj->q1)) && QEmpty(&(obj->q2));
}void myStackFree(MyStack* obj) {QDestroy(&(obj->q1));QDestroy(&(obj->q2));free(obj);
}

相关文章:
leetcode:用队列实现栈(后进先出)
题目描述 题目链接:225. 用队列实现栈 - 力扣(LeetCode) 题目分析 我们先把之前写的队列实现代码搬过来 用队列实现栈最主要的是实现栈后进先出的特点,而队列的特点是先进先出,那么我们可以用两个队列来实现 一个队…...
使用opencv实现更换证件照背景颜色
1 概述 生活中经常要用到各种要求的证件照电子版,红底,蓝底,白底等,大部分情况我们只有其中一种,本文通过opencv实现证件照背景的颜色替换。 1.1 opencv介绍 OpenCV(Open Source Computer Vision Librar…...
Unity打出的安卓包切换后台再恢复前台,卡顿许久问题记录
连接AndroidStudio发现当切换后台时提示:D/Unity: Multi-casting "[IP] 192.168.31.231 [Port] 55000 [Flags] 19 [Guid] 1268732307 [EditorId] 264356214 [Version] 1048832 [Id] AndroidPlayer(11,Xiaomi_M2012K11AC192.168.31.231) [Debug] 0 [PackageName…...
Linux常用命令----shutdown命令
文章目录 命令概述参数解释使用示例及解释 命令概述 shutdown 命令用于安全地关闭或重启 Linux 系统。它允许管理员指定一个时间点执行操作,并可发送警告信息给所有登录的用户。 参数解释 时间参数 ([时间]): now: 立即执行关闭或重启操作。m: 在 m 分钟后执行操作…...
美创科技受邀亮相第二届全球数字贸易博览会
11月23日-27日,由浙江省人民政府、商务部共同主办的第二届全球数字贸易博览会(以下简称“数贸会”)圆满落幕。围绕“国家级、国际性、数贸味”的目标定位,以“数字贸易 商通全球”为主题,数贸会重点展示数字贸易全产业…...
有n件物品,每件物品都有一个花费,要求每m个中必须至少选2个,求最小花费
题目 #include<bits/stdc.h> using namespace std; #define int long long #pragma GCC optimize(2) const int maxn 2e4 5, maxm 2e3 5, inf 1e9; int a[maxn]; int f[maxm][maxm];//f[i][j]表示选了第i个,上一个选的是第i-j个(每m个中选2个…...
Hive数据库与表操作
文章目录 一、准备工作二、Hive数据库操作(一)Hive数据存储(二)创建数据库(三)查看数据库(四)修改数据库信息 一、准备工作 二、Hive数据库操作 (一)Hive数据…...
C语言数据结构之顺序表(上)
前言: ⭐️此篇博文主要分享博主在学习C语言的数据结构之顺序表的知识点时写的笔记,若有错误,还请佬指出,一定感谢!制作不易,若觉得内容不错可以点赞👍收藏❤️,这是对博主最大的认可…...
详解原生Spring中的控制反转和依赖注入-构造注入和Set注入
😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群:583783…...
数组中的第 K 个最大元素(C++实现)
数组中的第 K 个最大元素 题目思路代码 题目 数组中的第 K 个最大元素 思路 通过使用优先队列(最大堆)来找到数组中第k大的元素。通过弹出最大堆中的前k-1个元素,留下堆中的顶部元素作为结果返回。 代码 class Solution { public:int find…...
C++ day42背包理论基础01 + 滚动数组
背包问题的重中之重是01背包 01背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 每一件物品其实只有两个状态,取或者不…...
数字人透明屏幕是如何工作的?
数字人透明屏幕是一种令人兴奋的科技产品,它结合了人脸识别、全息影像技术以及透明屏幕,为人们带来了全新的互动体验。本文将详细介绍数字人透明屏幕的工作原理以及其应用场景。 工作原理 数字人透明屏幕的工作原理主要包括人脸识别和全息影像技术。人脸…...
MIGO收货报替代“ZF002“, 步骤““ 中存在语法错误消息号 GB032错误
MIGO收货报替代"ZF002", 步骤"" 中存在语法错误消息号 GB032错误。替代"ZF002", 步骤"" 中存在语法错误消息号 GB032诊断 在 ABAP 代码生成过程中,在替代ZF002中发现了语法错误。 系统响应 未为该布尔陈述生成 ABAP 代码&…...
Vue3的transition标签以及animate.css使用详解
一:前言 在项目开发中,有一种特殊情况是使用动画过渡去完成某个效果。比如淡入淡出,或者在动画完成后执行某些操作等。在以前开发中我们通常会选择使用 CSS3 进行研发。但是这样会有很多不好的地方,比如最原始化的封装,…...
IDEA不支持Java8了怎么办?
IDEA不支持Java8了怎么办? 01 异常发生场景 当我准备创建一个springboot项目时,发现Java8没了 02 问题的产生及其原因 查阅了官方文档之后,确认了是Spring Boot 不再支持 Java 8,不是我的问题,这一天终于还是来了 0…...
flutter的TextField参数、案例整理(上)
TextField 概述 TextField 用于文本输入 构造函数 const TextField({Key key,this.controller, this.focusNode,this.decoration const InputDecoration(),TextInputType keyboardType,this.textInputAction,this.textCapitalization TextCapitalization.none,this.style…...
【Linux进阶之路】进程间通信
文章目录 一、原理二、方式1.管道1.1匿名管道1.1.1通信原理1.1.2接口使用 1.2命名管道 2.共享内存2.1原理2.2接口使用 3.消息队列原理 4.信号量引入原理 总结 一、原理 进程间的通信是什么?解释: 简单理解就是,不同进程之间进行数据的输入输出…...
深度学习框架配置
目录 1. 配置cuda环境 1.1. 安装cuda和cudnn 1.1.1. 显卡驱动配置 1.1.2. 下载安装cuda 1.1.3. 下载cudnn,将解压后文件复制到cuda目录下 1.2. 验证是否安装成功 2. 配置conda环境 2.1. 安装anaconda 2.2. conda换源 2.3. 创建conda环境 2.4. pip换源 3.…...
全局配置
1.全局配置文件及其配置项 1.1.小程序窗口 1.2 窗口节点 1.2.1 导航栏标题 标题: 标题颜色: 背景色:只支持16进制值 下拉刷新: 刷新背景色: 刷新样式: 触底距离:...
leetcode算法之字符串
目录 1.最长公共前缀2.最长回文子串3.二进制求和4.字符串相乘 1.最长公共前缀 最长公共前缀 class Solution { public:string longestCommonPrefix(vector<string>& strs) {//法一:两两比较string ret strs[0];for(int i1;i<strs.size();i){ret f…...
Guake与VTE集成原理:虚拟终端核心组件解析
Guake与VTE集成原理:虚拟终端核心组件解析 【免费下载链接】guake Drop-down terminal for GNOME 项目地址: https://gitcode.com/gh_mirrors/gu/guake Guake是一款基于GNOME桌面环境的下拉式终端模拟器,通过F12快捷键快速弹出,极大提…...
行式存储(Row-based Storage)和列式存储(Column-base Storage)简介穆
1. 哑铃图是什么? 哑铃图(Dumbbell Plot),有时也称为DNA图或杠铃图,是一种用于比较两个相关数据点的可视化图表。 它源于人们对更有效数据比较方式的持续探索。 在传统的时间序列比较中,我们通常使用两条折…...
解放你的无人机!DankDroneDownloader:轻松掌控DJI固件的终极指南
解放你的无人机!DankDroneDownloader:轻松掌控DJI固件的终极指南 【免费下载链接】DankDroneDownloader A Custom Firmware Download Tool for DJI Drones Written in C# 项目地址: https://gitcode.com/gh_mirrors/da/DankDroneDownloader 你知道…...
内存泄漏排查记:一场持续72小时的“捉鬼”行动
第一章:午夜告警——危机初现凌晨2:15,监控大屏骤然亮起刺目的红色。【关键指标异常】服务堆内存占用:98%(持续线性上升)Full GC频率:5次/分钟(正常值<0.2次)接口响应延迟&#x…...
2026.04.07随记
1、PyTorch1、dir(模块):查看任意模块的方法2、X.sum(0, keepdimTrue):keepdimTrue保留维度X torch.tensor([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]) # (2,3) X.sum(0, keepdimTrue), X.sum(1, keepdimTrue)…...
如何3分钟完成Windows和Office批量激活:KMS_VL_ALL_AIO终极指南
如何3分钟完成Windows和Office批量激活:KMS_VL_ALL_AIO终极指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是否曾因Windows系统弹出激活提示而烦恼?或者Office软件…...
**标题:MLOps实战进阶:用Python+Docker+Kubernetes打造自动化模型部署流水
标题:MLOps实战进阶:用PythonDockerKubernetes打造自动化模型部署流水线 在现代机器学习工程中,模型从实验到上线的全流程自动化已成为企业级落地的关键瓶颈。传统手动部署模式不仅效率低下,还容易因环境差异导致“在我电脑上能跑…...
react-native-fetch-blob完整教程:从零开始掌握文件上传下载
react-native-fetch-blob完整教程:从零开始掌握文件上传下载 【免费下载链接】react-native-fetch-blob A project committed to making file access and data transfer easier, efficient for React Native developers. 项目地址: https://gitcode.com/gh_mirror…...
Dynamic-Datasource数据源类型注册:SPI配置终极指南
Dynamic-Datasource数据源类型注册:SPI配置终极指南 【免费下载链接】dynamic-datasource dynamic datasource for springboot 多数据源 动态数据源 主从分离 读写分离 分布式事务 项目地址: https://gitcode.com/gh_mirrors/dy/dynamic-datasource Dynamic…...
科学/技术路线之争、天才 vs 体制、创新 vs 实用的对立故事
文章目录一、最像「交流电 vs 直流电」的路线大战1. **尼古拉特斯拉 vs 托马斯爱迪生**(你已知的原型)二、同级别的「史诗级科学互怼」2. **伽利略 vs 教会/亚里士多德学派**3. **牛顿 vs 莱布尼茨**4. **爱因斯坦 vs 玻尔**5. **巴斯德 vs 普歇**三、技…...
