当前位置: 首页 > news >正文

用两个队列实现栈

这里写目录标题

  • 用两个队列实现栈
    • 题目描述
    • 思路:
    • 结构逻辑图如下
    • 完整解析代码

用两个队列实现栈

leetcode

题目描述

在这里插入图片描述
在这里插入图片描述


思路:

准备两个队列,第一个队列依次出队到只剩一个数据时停止,将已出队的数据依次入队到第二个队列,将第一个队列仅剩的一个数据出队即实现了栈的出栈。入栈时哪个队列不为空则在哪个队列入队。
在这里插入图片描述

结构逻辑图如下


在这里插入图片描述


完整解析代码

typedef int QDataType;
typedef struct QueueNode
{struct QueueNode* next;QDataType data;
}QNode;typedef struct Queue
{QNode* phead;QNode* ptail;int size;
}Queue;void QueueInit(Queue* pq)
{assert(pq);pq->phead = NULL;pq->ptail = NULL;pq->size = 0;
}
void QueueDestroy(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 QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL) {perror("mallloc fail\n");return;}newnode->data = x;newnode->next = NULL;if (pq->ptail == NULL) {assert(pq->phead == NULL);pq->phead = pq->ptail = newnode;}else {pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->size == 0;
}
void QueuePop(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));if (pq->phead->next == NULL) {free(pq->phead);pq->phead = pq->ptail = NULL;}else {QNode* next = pq->phead->next;free(pq->phead);pq->phead = next;}pq->size--;
}
QDataType QueueFront(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->phead->data;
}
QDataType QueueBack(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->ptail->data;
}
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}//------以下为OJ提供-------typedef struct {Queue q1;Queue q2;
} MyStack;MyStack* myStackCreate() {MyStack* obj = (MyStack*)malloc(sizeof(MyStack));if (obj == NULL) {perror("malloc fail");return NULL;}QueueInit(&obj->q1);QueueInit(&obj->q2);return obj;
}void myStackPush(MyStack* obj, int x) {if (!QueueEmpty(&obj->q1)) {QueuePush(&obj->q1, x);}else {QueuePush(&obj->q2, x);}
}int myStackPop(MyStack* obj) {Queue* pEmptyQ = &obj->q1;Queue* pNonEmptyQ = &obj->q2;if (!QueueEmpty(&obj->q1)) {pEmptyQ = &obj->q2;pNonEmptyQ = &obj->q1;}while (QueueSize(pNonEmptyQ) > 1) {QueuePush(pEmptyQ, QueueFront(pNonEmptyQ));QueuePop(pNonEmptyQ);}int top = QueueFront(pNonEmptyQ);QueuePop(pNonEmptyQ);return top;
}int myStackTop(MyStack* obj) {if (!QueueEmpty(&obj->q1)) {return QueueBack(&obj->q1);}else {return QueueBack(&obj->q2);}
}bool myStackEmpty(MyStack* obj) {return QueueEmpty(&obj->q1) &&QueueEmpty(&obj->q2);
}void myStackFree(MyStack* obj) {QueueDestroy(&obj->q1);QueueDestroy(&obj->q2);free(obj);
}

相关文章:

  • Day 17------C语言收尾之链表的删除、位运算、预处理、宏定义
  • 开源模型应用落地-业务优化篇(三)
  • logback日志配置
  • mongodb数据库集合(表)的创建和数据修改
  • 虹科技术|一文详解IO-Link Wireless技术如何影响工业无线自动化
  • MySQL分区的优缺点
  • 分类预测 | Matlab实现GAF-PCNN-MATT格拉姆角场和双通道PCNN融合多头注意力机制的分类预测/故障识别
  • 力扣热门100题刷题笔记 - 10. 正则表达式匹配
  • C语言顺序表
  • 【图论】基环树
  • 16.docker删除redis缓存数据、redis常用基本命令
  • 关于Linux和消息队列常见的十道面试题
  • 如何使用VS Code编写小游戏并实现公网游玩本地游戏【内网穿透】
  • 100天精通Python(实用脚本篇)——第115天:基于selenium实现反反爬策略之隐藏浏览器指纹特征
  • Flask 入门5 :过滤器
  • Docker入门(二) - Dockerfile
  • egg(89)--egg之redis的发布和订阅
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Travix是如何部署应用程序到Kubernetes上的
  • tweak 支持第三方库
  • windows下使用nginx调试简介
  • 番外篇1:在Windows环境下安装JDK
  • 两列自适应布局方案整理
  • 让你的分享飞起来——极光推出社会化分享组件
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 找一份好的前端工作,起点很重要
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​第20课 在Android Native开发中加入新的C++类
  • ​如何在iOS手机上查看应用日志
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (23)Linux的软硬连接
  • (4)事件处理——(7)简单事件(Simple events)
  • (6)设计一个TimeMap
  • (70min)字节暑假实习二面(已挂)
  • (NSDate) 时间 (time )比较
  • (办公)springboot配置aop处理请求.
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (七)Java对象在Hibernate持久化层的状态
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (十一)图像的罗伯特梯度锐化
  • (一)VirtualBox安装增强功能
  • (转)c++ std::pair 与 std::make
  • (转)为C# Windows服务添加安装程序
  • (转)重识new
  • .Net Redis的秒杀Dome和异步执行
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .net和php怎么连接,php和apache之间如何连接
  • .net开发引用程序集提示没有强名称的解决办法
  • .NET中使用Redis (二)
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国