LeetCode—用队列实现栈

一.题目

二.思路

1.后入先出的实现:

创建两个队列来实现栈(后入先出):

两个队列,保持一个存数据,另一个为空,入数据(push)要入不为空的队列,(pop)时要把非空队列的前size-1个数据转移到空队列中,所剩下的数据就是我们要出的数据(pop)。

2.图示: 

3.整体实现

 这里我们将队列q1,q2封装在结构体MyStack中,所以我们的关系构架为:

(1)初始化

为了防止局部变量出作用域后销毁,这里要malloc新的结构体。

MyStack* myStackCreate() 
{MyStack* st=(MyStack*)malloc(sizeof(MyStack));if(st==NULL)return false;QueueInit(&st->q1);QueueInit(&st->q2);return st;
}

 (2)入数据

入数据时要入非空队列中去

void myStackPush(MyStack* obj, int x) 
{if(QueueSize(&obj->q1)!=0){QueuePush(&obj->q1,x);}else{QueuePush(&obj->q2,x);}
}

(3)出数据

为保证后入先出,我们将非空队列的前size-1个数据转移到空队列中去,剩下来的那一个数据就是栈顶元素。

int myStackPop(MyStack* obj) 
{Queue* tmp=&obj->q1;Queue* notmp=&obj->q2;if(QueueSize(notmp)==0){tmp=&obj->q2;notmp=&obj->q1;}while(QueueSize(notmp)>1){QueuePush(tmp,QueueFront(notmp));QueuePop(notmp);}QDataType res=QueueFront(notmp);QueuePop(notmp);return res;
}

 (4)返回栈顶元素

int myStackTop(MyStack* obj) 
{if(QueueSize(&obj->q1)!=0)return QueueBack(&obj->q1);elsereturn QueueBack(&obj->q2);
}

 (5)判空

两个队列都为空才能说明栈是空的

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

(6)销毁

要先将两个队列销毁,再销毁结构体obj。

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

三.参考代码

typedef int QDataType;typedef struct QNode
{struct QNode* next;QDataType data;
}QNode;typedef struct Queue
{QNode* head;QNode* tail;int size;
}Queue;void QueueInit(Queue* pq);
void QueueDestory(Queue* pq);void QueuePush(Queue* pq, QDataType x);
void QueuePop(Queue* pq);QDataType QueueFront(Queue* pq);
QDataType QueueBack(Queue* pq);bool QueueEmpty(Queue* pq);
int QueueSize(Queue* pq);
void QueueInit(Queue* pq)
{assert(pq);pq->head = pq->tail = NULL;pq->size = 0;
}
void QueueDestory(Queue* pq)
{assert(pq);QNode* cur =pq->head;while (cur){QNode* next = cur->next;free(cur);cur = next;}pq->head = pq->tail = NULL;pq->size = 0;
}void QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* tmp = (QNode*)malloc(sizeof(QNode));if (tmp == NULL){perror("malloc failed");exit(-1);}tmp->next = NULL;tmp->data = x;if (pq->head == pq->tail && pq->head == NULL){pq->head = pq->tail = tmp;}else{pq->tail->next = tmp;pq->tail = tmp;}pq->size++;
}
void QueuePop(Queue* pq)
{assert(pq);assert(pq->head != NULL);if (pq->head->next == NULL){free(pq->head);pq->head = pq->tail = NULL;}else{QNode* next = pq->head->next;free(pq->head);pq->head = next;}pq->size--;
}QDataType QueueFront(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->head->data;
}
QDataType QueueBack(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->tail->data;
}bool QueueEmpty(Queue* pq)
{assert(pq);return pq->size == 0;
}
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}typedef struct 
{Queue q1;Queue q2;
} MyStack;MyStack* myStackCreate() 
{MyStack* st=(MyStack*)malloc(sizeof(MyStack));if(st==NULL)return false;QueueInit(&st->q1);QueueInit(&st->q2);return st;
}void myStackPush(MyStack* obj, int x) 
{if(QueueSize(&obj->q1)!=0){QueuePush(&obj->q1,x);}else{QueuePush(&obj->q2,x);}
}int myStackPop(MyStack* obj) 
{Queue* tmp=&obj->q1;Queue* notmp=&obj->q2;if(QueueSize(notmp)==0){tmp=&obj->q2;notmp=&obj->q1;}while(QueueSize(notmp)>1){QueuePush(tmp,QueueFront(notmp));QueuePop(notmp);}QDataType res=QueueFront(notmp);QueuePop(notmp);return res;
}int myStackTop(MyStack* obj) 
{if(QueueSize(&obj->q1)!=0)return QueueBack(&obj->q1);elsereturn QueueBack(&obj->q2);
}bool myStackEmpty(MyStack* obj) 
{return QueueEmpty(&obj->q1)  &&  QueueEmpty(&obj->q2);
}void myStackFree(MyStack* obj) 
{QueueDestory(&obj->q1);QueueDestory(&obj->q2);free(obj);
}

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

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

相关文章

DDS块集是如何工作的?

DDS块集使你能够在Simulink中创建DDS应用程序。如果你有一个在Simulink中建模的应用程序,希望能够使用DDS,则可以使用DDS块集轻松连接到DDS中间件平台。 DDS块集将DDS概念引入Simulink环境,在Simulink应用程序中对这些概念进行建模&#xff0…

STM32串口通信入门

文章目录 一、串口协议和RS-232标准,以及RS232电平与TTL电平的区别1.串口通信协议2.RS-232标准3.RS232电平与TTL电平的区别4.USB/TTL转232“模块(CH340芯片为例) 二、补充实验(一)几个常见的库函数、结构体1.时钟配置函…

【机器学习数据可视化-04】Pyecharts数据可视化宝典

一、引言 在大数据和信息爆炸的时代,数据可视化成为了信息传递和展示的关键手段。通过直观的图表和图形,我们能够更好地理解数据,挖掘其背后的信息。Pyecharts,作为一款基于Python的数据可视化库,凭借其丰富的图表类型…

多模态EDA论文小记

论文地址 该论文主要改进点是:通过动态化局部搜索中每个集群大小,高斯和柯西分布共同产生个体。总的来说改进点不多,当然也可能是笔者还没发现。 局部搜索 划分集群 划分集群有两个策略分别是: 随机生成一个点作为中心点&…

MySQL表死锁查询语句

步骤1:查询表死锁的sql语句: SELECT * FROM information_schema.PROCESSLIST where length(info) >0 ; 或 SELECT * FROM information_schema.INNODB_TRX; 步骤2:删除 kill "对应的线程id"

【JVM】Class文件的格式

目录 概述 Class文件的格式 概述 Class文件是JVM的输入,Java虚拟机规范中定义了Class文件的结构。Class文件是JVM实现平台无关、技术无关的基础。 1:Class文件是一组以8字节为单位的字节流,各个数据项目按顺序紧凑排列 2:对于占用空间大于8字节的数据…

16 华三数据中心最流行的技术 M-LAG

STP和MTP(第二十二课)-CSDN博客 VRRP技术和浮动路由(第二十六课)_vrrp 浮动路由-CSDN博客 VRRP DHCP ACL NAT 网络核心路由技术综述 (第十课)-CSDN博客 04 交换机的IRF的配置-CSDN博客 1 M-LAG AI介绍 M-LAG(Multi-Chassis Link Aggrega…

其他的 框架安全:Apache Solr 远程代码漏洞.(CVE-2019-0193)

什么是 Apache Solr Apache Solr是一个开源的搜索服务,便用Java语言开发,主要基于 HTTP 和ApacheLucene 实现的。Sor是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。 目录: 什么是 Apache Solr 生成的漏…

基于yolov5+streamlit目标检测演示系统设计

YOLOv5与Streamlit:智能目标检测可视化展示介绍 随着人工智能技术的飞速发展,目标检测技术已成为推动智能化社会进步的关键技术之一。在众多目标检测算法中,YOLOv5以其卓越的性能和实时性,成为了业界的佼佼者。与此同时&#xff…

Spring Boot 集成 sa-token 实践教程

Spring Boot 集成 sa-token 实践教程 sa-token 是一个轻量级且功能强大的权限认证框架,它基于Java语言,专为Java开发者设计,以简化权限管理的复杂性。在Spring Boot项目中集成sa-token,可以快速实现会话管理、权限控制等功能。本文…

程序员必读书单(CSDN专享)

大家好,我是王有志,一个分享硬核 Java 技术的金融摸鱼侠,欢迎大家加入 Java 人自己的交流群“共同富裕的 Java 人”。 今天是一篇分享资源的汇总,近半年来我总计分享了 202 本(将近 10G )的计算机领域著作…

智慧法治:AI技术如何赋能法律行业创新

🧑 作者简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

Git 的原理与使用(上)

Git是一个分布式版本控制系统,它被广泛用于协作开发和管理软件项目。开发人员可以通过Git来跟踪文件的变化、协调工作、并管理项目的不同版本。 Git允许用户在不同的分支上开发新功能,然后合并这些分支并确保团队成员之间的工作协调一致。此外&#xff…

微信小程序踩坑,skyline模式下,scroll-view下面的一级元素设置margin中的auto无效,具体数据有效

开发工具版本 基础库 开启skyline渲染调试 问题描述 skyline模式下,scroll-view下面的一级元素的margin写auto的值是没有效果的(二级元素margin写auto是有效果的),关闭这个模式就正常显示 演示效果图 父元素的宽度和高度效果(宽度是750rpx,宽度占满的) 一级元素宽度和css效果…

Python游戏制作大师,Pygame库的深度探索与实践

写在前言 hello,大家好,我是一点,专注于Python编程,如果你也对感Python感兴趣,欢迎关注交流。 希望可以持续更新一些有意思的文章,如果觉得还不错,欢迎点赞关注,有啥想说的&#x…

笔记3:torch训练测试VGG网络

(1)利用Netron查看网络实际情况 上图链接 python生成上图代码如下,其中GETVGGnet是搭建VGG网络的程序GETVGGnet.py,VGGnet是该程序中的搭建网络类。netron是需要pip安装的可视化库,注意do_constant_foldingFalse可以防…

【简单介绍下Sass】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

Windows 查找端口号关闭端口号关闭进程的操作流程

Windows 查找端口号关闭端口号关闭进程 8000为端口号 1.查看端口占用程序的ID号 netstat -aon|findstr "8000"比如结果是5684 2.查看ID对应的程序进程 tasklist|findstr "6884"3.关闭进程 taskkill -PID 6884 -F成功: 已终止 PID 为 5684 的进程。

华为机试打卡 HJ2 计算某字符出现次数

要机试了,华孝子求捞,功德 描述 写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母) 数据范围: 1≤&a…

【复杂网络】如何用简易通俗的方式快速理解什么是“相对重要节点挖掘”?

什么是相对重要节点? 一、相对重要节点的定义二、如何区分相对重要节点与重要节点?1. 相对重要性与节点相似性2. 识别相对重要节点的两个阶段第一阶段:个体重要性值的计算第二阶段:累积重要性值的计算 三、相对重要节点挖掘算法1.…