LeetCode | 225. 用队列实现栈

LeetCode | 225. 用队列实现栈

OJ链接

在这里插入图片描述

  • 此题可以用两个队列去实现一个栈,每次始终保持一个队列为空,
    入栈操作相当于给非空队列进行入队操作

  • 入数据,把不为空的队列入

  • 出数据,把不为空的队列数据导入为空,直到最后一个

  • 出栈操作相当于非空队列的队尾元素出队,此时需要把非空队列除最后一个元素之外的其余元素入队到空队列,然后出队最后一个队尾元素

在这里插入图片描述

代码如下:

typedef int QDataType;typedef struct QueueNode
{struct QueueNode* next;QDataType data;
}QueueNode;typedef struct Queue
{QueueNode* head;QueueNode* tail;
}Queue;void QueueInit(Queue* pq);//队列初始化
void QueueDestroy(Queue* pq);//销毁
void QueuePush(Queue* pq,QDataType x);//添加
void QueuePop(Queue* pq);//删除
QDataType QueueFront(Queue* pq);//头数
QDataType QueueBack(Queue* pq);//尾数
int QueueSize(Queue* pq);//个数
bool QueueEmpty(Queue* pq);//判断是否为空void QueueInit(Queue* pq)
{assert(pq);pq->head = pq->tail = NULL;
}
void QueueDestroy(Queue* pq)//销毁
{assert(pq);while (pq->head !=NULL){QueueNode* tmp = pq->head;pq->head = pq->head->next;free(tmp);}pq->head = pq->tail = NULL;
}
void QueuePush(Queue* pq, QDataType x)//添加
{assert(pq);QueueNode* NewNode = (QueueNode*)malloc(sizeof(QueueNode));NewNode->data = x;NewNode->next = NULL;if (pq->head ==NULL)pq->head = pq->tail=NewNode;else{pq->tail->next = NewNode;pq->tail = NewNode;}
}
void QueuePop(Queue* pq)//删除
{assert(pq);assert(pq->head);if (pq->head == pq->tail)pq->tail = NULL;QueueNode* tmp = pq->head->next;free(pq->head);pq->head = tmp;}
QDataType QueueFront(Queue* pq)//头数
{assert(pq);assert(pq->head);return pq->head->data;
}
QDataType QueueBack(Queue* pq)//尾数
{assert(pq);assert(pq->tail);return pq->tail->data;
}
int QueueSize(Queue* pq)//个数
{assert(pq);int count = 0;QueueNode* tmp = pq->head;while (tmp != NULL){count++;tmp = tmp->next;}return count;
}
bool QueueEmpty(Queue* pq)//判断是否为空
{if (QueueSize(pq) == 0)return true;elsereturn false;
}
typedef struct {Queue q1;Queue q2;
} MyStack;MyStack* myStackCreate() {MyStack *obj=(MyStack*)malloc(sizeof(MyStack));QueueInit(&obj->q1);QueueInit(&obj->q2);return obj;
}void myStackPush(MyStack* obj, int x) {Queue*cur=&obj->q1;//选出含有数据的队列if(!QueueEmpty(&obj->q2))cur=&obj->q2;QueuePush(cur,x);
}int myStackPop(MyStack* obj) {Queue*cur1=&obj->q1;//有数据Queue*cur2=&obj->q2;//无数据if(!QueueEmpty(&obj->q2)){cur1=&obj->q2;cur2=&obj->q1;}while(cur1->head!=cur1->tail){QueuePush(cur2,QueueFront(cur1));QueuePop(cur1);}int top=QueueFront(cur1);QueuePop(cur1);return top;
}int myStackTop(MyStack* obj) {Queue*cur=&obj->q1;if(!QueueEmpty(&obj->q2))cur=&obj->q2;return QueueBack(cur);
}bool myStackEmpty(MyStack* obj) {return (QueueEmpty(&obj->q1)&&QueueEmpty(&obj->q2));
}void myStackFree(MyStack* obj) {QueueDestroy(&obj->q1);QueueDestroy(&obj->q2);free(obj);
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代号:408 —— 1000道精心打磨的计算机考研题

文章目录 📋前言🎯计算机科学与技术专业介绍(14年发布)🧩培养目标🧩毕业生应具备的知识和能力🧩主要课程 🎯代号:408🔥文末送书🧩有什么优势&…

golang中context使用总结

一、context使用注意事项 在使用context时,有一些需要注意的事项,以及一些与性能优化相关的建议: 避免滥用context传递数据:context的主要目的是传递请求范围的数据和取消信号,而不是用于传递全局状态或大量数据。滥用…

RedisDesktopManager连接不上redis的解决方法

RedisDesktopManager连接不上redis的解决方法 RedisDesktopManager是一款连接redis数据库的客户端。 当连接不上redis的时候,解决方案: 第一步:在自己的本机外面试下,能不能连接上虚拟机 打开cmd,使用ping 虚拟机ip地址。如果…

[文件读取]webgrind 文件读取 (CVE-2018-12909)

1.1漏洞描述 漏洞编号CVE-2018-12909漏洞类型文件读取漏洞等级⭐⭐⭐漏洞环境VULFOCUS攻击方式 1.2漏洞等级 高危 1.3影响版本 Webgrind 1.5版本 1.4漏洞复现 1.4.1.基础环境 1.4.2.前提 网站后台地址: 后台管理账密: 后台登录地址 1.5深度利用 …

基于opencv+tensorflow+神经网络的智能银行卡卡号识别系统——深度学习算法应用(含python、模型源码)+数据集(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境OpenCV环境 相关其它博客工程源代码下载其它资料下载 前言 本项目基于从网络获取的多种银行卡数据集,采用OpenCV库的函数进行图像处理,并通过神经网络进行模型训练。最终实…

13. 高精度延时

13. 高精度延时 GPT 定时器简介GPT 定时器结构GPT 定时器工作模式 GPT 定时器相关寄存器GPTx_CRGPTx_PRGPTx_SRGPTx_CNTGPTx_OCR GPT 配置步骤程序编写bsp_delay.hbsp_delay.cmain GPT 定时器简介 GPT 定时器是一个 32 位向上定时器,也就是从0x00000000 开始向上递…

学【Java多态】-- 写高质量代码

多态的实现条件 在java中要实现,必须要满足如下几个条件,缺一不可。 1.必须在继承体系下2.子类必须要对父类中的方法进行重写3.通过父类的引用调用冲写的方法。 想要真正的学好多态需要去学习一些前置知识,那我们直接开始吧! …

Day30力扣打卡

打卡记录 最长回文子序列(区间DP) 链接 class Solution:def longestPalindromeSubseq(self, s: str) -> int:n len(s)f [[0] * n for _ in range(n)]max lambda x, y: x if x > y else yfor i in range(n - 1, -1, -1):f[i][i] 1for j in ra…

Zookeeper概述

ZooKeeper概述 1 分布式应用程序2 分布式应用程序的特点3 Apache ZooKeeper简介4 ZooKeeper客户端 - 服务器架构5 ZooKeeper 分层命名空间6 Zookeeper 工作流7 ZooKeeper 选举机制7.1 ZooKeeper选举概述7.1.1 两种情况分析 7.2 选举实现细节 8 FastLeaderElection:选…

数字媒体技术基础之:常见图片文件格式

在数字图像处理和图形设计领域,了解不同的图片文件格式及其特点是至关重要的。每种格式都有其独特的用途和优势。以下介绍一些最常见的图片文件格式。 JPEG Joint Photographic Experts Group 扩展名:.jpg 或 .jpeg 特点: 1、有损压缩&#x…

二十、泛型(7)

本章概要 动态类型安全泛型异常混型 C 中的混型与接口混合使用装饰器模式与动态代理混合 动态类型安全 因为可以向 Java 5 之前的代码传递泛型集合,所以旧式代码仍旧有可能会破坏你的集合。Java 5 的 java.util.Collections 中有一组便利工具,可以解…

【多样注释】刚入职就崩溃!这段神秘注释让人无法忍受

最近写码写的头晕脑涨,同事听完后给我发来几张神图,我看完当场笑尿🤣,分享一下,权当博君一笑了。 代码注释图案传送门 1、看到了这个注释,心凉了一半 2、阅读源码的人,心里一定的崩溃的 3、这…