[Leetcode]用队列实现栈

1.用队列实现栈

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppop 和 empty)。

实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

目录

题解:

1.既是以队列(Queue)实现栈(Stack),那首先要实现队列的基础功能:

2.基于队列(Queue)实现栈(Stack):

出栈:

入栈:

获取栈顶元素:

判空:

3.注意:

4..完整代码:


题解:

1.既是以队列(Queue)实现栈(Stack),那首先要实现队列的基础功能:

初始化(QueueInit),出入队列(QueuePush)(QueuePop),判空(QueueEnpty)

typedef int QueueDataType;
typedef struct QueueData{QueueDataType Data;struct QueueData* Next;
}QD;
typedef struct{QD* head;QD* rear;
}Queue;
//初始化队列
void QueueInit(Queue*tmp) {tmp->head = tmp->rear = NULL;
}
//判空
bool QueueEmpty(Queue* tmp) {assert(tmp);return tmp->rear == NULL;
}
//入队列
void QueuePush(Queue*tmp,QueueDataType x) {assert(tmp);QD* p = (QD*)malloc(sizeof(QD));if (p == NULL) {perror("Push:malloc");return;}p->Data = x;p->Next = NULL;if (tmp->rear == NULL) {tmp->head = tmp->rear = p;}else {tmp->rear->Next = p;tmp->rear = p;}
}
//出队列
QueueDataType QueuePop(Queue*tmp) {assert(tmp);QueueDataType data;if (QueueEmpty(tmp)) {perror("QueuePop:NULL");}else if (tmp->head == tmp->rear) {data = tmp->head->Data;free(tmp->head);tmp->head = tmp->rear = NULL;}else {data = tmp->head->Data;QD* p = tmp->head;tmp->head = tmp->head->Next;free(p);p = NULL;}return data;
}

2.基于队列(Queue)实现栈(Stack):

出栈:

结合队列先进先出的特性,要满足栈后入先出,只需要两个队列互相配合(一个(a)队列接收(n个)入栈元素,当要出栈时只需要将(n-1个)元素出队列到另一个(b)队列中,最后将(a)队列中最后一个元素出队列即可)

QueueDataType myStackPop(MyStack* obj) {if (QueueEmpty(&obj->queue1) && QueueEmpty(&obj->queue2)) {perror("StackPop:NULL");}if (QueueEmpty(&obj->queue2)) {while (obj->queue1.head != obj->queue1.rear) {QueuePush(&obj->queue2, QueuePop(&obj->queue1));}return QueuePop(&obj->queue1);}else {while (obj->queue2.head != obj->queue2.rear) {QueuePush(&obj->queue1, QueuePop(&obj->queue2));}return QueuePop(&obj->queue2);}
}
入栈:

同理,入栈也需要两个队列配合,用一个队列接收元素,并标记该队列,另一个为空

void myStackPush(MyStack* obj, QueueDataType x) {if (QueueEmpty(&obj->queue2)) {QueuePush(&obj->queue1, x);}else {QueuePush(&obj->queue2, x);}
}
获取栈顶元素:

只需找到不为空的队列,返回该队列的队尾元素即可

QueueDataType myStackTop(MyStack* obj) {if (QueueEmpty(&obj->queue1) && QueueEmpty(&obj->queue2)) {perror("StackTop:NULL");return 0;}if (QueueEmpty(&obj->queue2)) {return obj->queue1.rear->Data;}else {return obj->queue2.rear->Data;}
}
判空:

判断构成栈的两个队列都为空,即栈为空

bool myStackEmpty(MyStack* obj) {return (QueueEmpty(&obj->queue1) && QueueEmpty(&obj->queue2));}

3.注意:

实现队列和栈的过程中,想内存申请的空间,最后要记得释放,防止内存泄漏

4..完整代码:

#include<stdio.h>
#include<stdbool.h>
#include<assert.h>
#include<stdlib.h>
typedef int QueueDataType;
typedef struct QueueData{QueueDataType Data;struct QueueData* Next;
}QD;
typedef struct{QD* head;QD* rear;
}Queue;
typedef struct{Queue queue1;Queue queue2;
} MyStack;
void QueueInit(Queue*tmp) {tmp->head = tmp->rear = NULL;
}
bool QueueEmpty(Queue* tmp) {assert(tmp);return tmp->rear == NULL;
}
MyStack* myStackCreate() {MyStack* stack = (MyStack*)malloc(sizeof(MyStack));QueueInit(&stack->queue1);QueueInit(&stack->queue2);return stack;
}
void QueuePush(Queue*tmp,QueueDataType x) {assert(tmp);QD* p = (QD*)malloc(sizeof(QD));if (p == NULL) {perror("Push:malloc");return;}p->Data = x;p->Next = NULL;if (tmp->rear == NULL) {tmp->head = tmp->rear = p;}else {tmp->rear->Next = p;tmp->rear = p;}
}
QueueDataType QueuePop(Queue*tmp) {assert(tmp);QueueDataType data;if (QueueEmpty(tmp)) {perror("QueuePop:NULL");}else if (tmp->head == tmp->rear) {data = tmp->head->Data;free(tmp->head);tmp->head = tmp->rear = NULL;}else {data = tmp->head->Data;QD* p = tmp->head;tmp->head = tmp->head->Next;free(p);p = NULL;}return data;
}
void myStackPush(MyStack* obj, QueueDataType x) {if (QueueEmpty(&obj->queue2)) {QueuePush(&obj->queue1, x);}else {QueuePush(&obj->queue2, x);}
}QueueDataType myStackPop(MyStack* obj) {if (QueueEmpty(&obj->queue1) && QueueEmpty(&obj->queue2)) {perror("StackPop:NULL");}if (QueueEmpty(&obj->queue2)) {while (obj->queue1.head != obj->queue1.rear) {QueuePush(&obj->queue2, QueuePop(&obj->queue1));}return QueuePop(&obj->queue1);}else {while (obj->queue2.head != obj->queue2.rear) {QueuePush(&obj->queue1, QueuePop(&obj->queue2));}return QueuePop(&obj->queue2);}
}QueueDataType myStackTop(MyStack* obj) {if (QueueEmpty(&obj->queue1) && QueueEmpty(&obj->queue2)) {perror("StackTop:NULL");return 0;}if (QueueEmpty(&obj->queue2)) {return obj->queue1.rear->Data;}else {return obj->queue2.rear->Data;}
}bool myStackEmpty(MyStack* obj) {return (QueueEmpty(&obj->queue1) && QueueEmpty(&obj->queue2));}void myStackFree(MyStack* obj) {QD* cur = obj->queue1.head;while (cur) {QD* tmp = cur;cur = cur->Next;free(tmp);tmp = NULL;}cur = obj->queue2.head;while (cur) {QD* tmp = cur;cur = cur->Next;free(tmp);tmp = NULL;}
}

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

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

相关文章

C语言和JAVA语言的语法小区别

学习记录 记录一些学习过程的&#xff0c;防止后续遗忘&#xff0c;方便回顾 文章目录 学习记录一、数据类型二、标识符三、流程控制语句四、输入输出五、switch语句六、数组 一、数据类型 C语言 基本数据类型&#xff1a; 整型&#xff1a;short&#xff08;2B&#xff09;…

《Kubernetes部署篇:基于Kylin V10+ARM架构CPU+外部etcd使用containerd部署K8S 1.26.15容器版集群(多主多从)》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;企业级K8s集群运维实战 1、在当前实验环境中安装K8S1.25.14版本&#xff0c;出现了一个问题&#xff0c;就是在pod中访问百度网站&#xff0c;大…

Mysql嵌套查询太简单了

1、子查询的分类 不相关查询&#xff1a; 子查询能独立执行 相关查询&#xff1a; 子查询不能独立运行 相关查询的执行顺序&#xff1a; 首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询, 若WHERE子句返回值为真&#xff0c;则取此元组放入结果…

maven3.9+下载安装

maven介绍 Maven 是一个项目管理和理解工具&#xff0c;它基于项目对象模型&#xff08;POM&#xff09;概念。Maven 可以帮助开发者定义项目结构、依赖关系、构建过程以及其他任务。它主要用于 Java 项目&#xff0c;但也可以用于其他类型的项目。Maven 的主要目标是简化构建…

hacs安装midea ac lan 0.3.22无法下载

1.hacs下载midea ac lan 0.3.20安装成功 2.GitHub下载0.3.22zip包 3.上传至群晖文件夹 4.SSH连接操作先备份一下 cp -r /var/packages/HomeAssistant/home/.homeassistant/custom_components/midea_ac_lan/ /volume2/homes/ 5.删除 rm -rf /var/packages/HomeAssistant/home/.h…

Centos7 ElasticSearch集群搭建

1. 服务器环境配置 1.1 配置hosts文件 3台服务器都要执行 vim /etc/hosts; # 将以下内容写入3台服务器hosts文件 192.168.226.148 es001 192.168.226.149 es002 192.168.226.150 es003 1.2 关闭防火墙 3台服务器都要执行 systemctl stop firewalld; systemctl disable…

探究汇编中的栈帧和局部变量

本节视频学习链接&#xff1a;https://pan.quark.cn/s/2db92a03734d 汇编语言中的函数调用和局部变量的管理是通过栈帧&#xff08;Stack Frame&#xff09;来实现的。栈帧是在函数调用时创建的&#xff0c;它存储了函数的局部变量、参数以及返回地址。本文将详细讲解栈帧的概…

未来互联网

未来互联网的发展将涉及人、物、环境三个方面的系统整合&#xff0c;下面是具体的解释&#xff1a; 人&#xff1a;未来互联网将更加人性化&#xff0c;通过智能化技术实现个性化服务和定制化体验&#xff0c;从而提高用户的满意度和忠诚度。同时&#xff0c;未来互联网也将加强…

Python语言零基础入门——条件判断

目录 一、单分支选择结构&#xff1a;if语句 二、双分支选择结构&#xff1a;if-else 三、多分支选择结构 四、嵌套选择 五、match语句 match与if的对比 六、代码规范 七、练习题 1.年龄判断 2.成绩判断 3.闰年判断 一、单分支选择结构&#xff1a;if语句 if 条件&…

STM 32 GPIO 的几种工作模式怎么运行?

在嵌入式开发领域&#xff0c;STM32微控制器系列因为功能强大和灵活性而广受欢迎。 其中&#xff0c;通用输入输出&#xff08;GPIO&#xff09;是最基础的功能&#xff0c;用于与外部世界的直接电子接口。 STM32 GPIO可以配置为多种工作模式&#xff0c;以适应不同的应用场景…

OpenCV从入门到精通实战(四)——答题卡识别判卷系统

基于OpenCV的答题卡识别系统&#xff0c;其主要功能是自动读取并评分答题卡上的选择题答案。系统通过图像处理和计算机视觉技术&#xff0c;自动化地完成了从读取图像到输出成绩的整个流程。下面是该系统的主要步骤和实现细节的概述&#xff1a; 1. 导入必要的库 系统首先导入…

偏微分方程算法之一阶双曲差分法

目录 一、研究目标 二、理论推导 2.1 引言 2.2 迎风格式 2.3 完全不稳定差分格式 2.4 蛙跳格式&#xff08;Leapfrog&#xff09; 2.5 Lax-Friedrichs格式 2.6 Lax-Wendroff格式 2.7 Beam-Warming格式 2.8 隐格式 2.9 Courant-Friedrichs-Lewy条件&#xff08;CFL条…

(51单片机)第十一章-串行口应用提高

11.1 方式0应用 在第6章中&#xff0c;已经对51单片机的串行口结构做过详细介绍&#xff0c;并且通过实例讲解了串行口的4种工作方式中方式1的具体用法&#xff0c;本节详细讲述串行口方式0的用法。 串行口方式0被称为同步移位寄存器的输入/输出方式&#xff0c;主要用于扩展并…

【结构型模式】外观模式

​一、外观模式概述 外观模式定义与意图&#xff1a;外观类为复杂的子系统提供了一个统一的入口。外观模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。&#xff08;对象结构型模式&#xff09; 外观模式的特点&#xff1a; 1.又叫做门面模式&#xf…

试驾小米SU7后,我准备退了我的订单

文 | AUTO芯球 作者 | 雷歌 我真想退了我之前大定的小米SU7Pro版&#xff01; 前两天我不是和朋友三人一起开着问界M9去试驾SU7了嘛&#xff0c; 说实话&#xff0c;这一圈下来&#xff0c;有欣喜有失望。 SU7的优点特别明显&#xff0c;也很突出&#xff0c; 就是它的底…

了解MySQL InnoDB多版本

了解MySQL InnoDB多版本 在数据库管理系统中&#xff0c;多版本并发控制&#xff08;MVCC&#xff09;是一种用于实现高并发和事务隔离的技术。MySQL的InnoDB存储引擎支持MVCC&#xff0c;这使得它可以在提供高事务性能的同时&#xff0c;也保证了数据的一致性和隔离性 MVCC简…

MySQL中的死锁预防和解决

MySQL中的死锁预防和解决 死锁是数据库管理系统中常见的问题&#xff0c;特别是在高并发的应用场景下。MySQL数据库中的死锁会导致事务处理速度减慢&#xff0c;甚至完全停止&#xff0c;因此理解并预防死锁至关重要。本文将详细介绍如何预防MySQL中的死锁&#xff0c;包括常用…

IBM SPSS Statistics for Mac:数据分析的卓越工具

IBM SPSS Statistics for Mac是一款功能强大的数据分析软件&#xff0c;专为Mac用户设计&#xff0c;提供了一系列专业的统计分析和数据管理功能。无论是科研人员、数据分析师还是学生&#xff0c;都能从中获得高效、准确的数据分析支持。 IBM SPSS Statistics for Mac v27.0.1…

C# 语言类型(一)—预定义类型值之数值类型

总目录 C# 语法总目录 参考链接&#xff1a; C#语法系列:C# 语言类型(一)—预定义类型值之数值类型 C#语法系列:C# 语言类型(二)—预定义类型之字符串及字符类型简述 C#语法系列:C# 语言类型(三)—数组/枚举类型/结构体 C#语法系列:C# 语言类型(四)—传递参数及其修饰符 C#语法…

Ubuntu 安装 wine

本文所使用的 Ubuntu 系统版本是 Ubuntu 22.04 ! 如果你使用 Ubuntu 系统&#xff0c;而有些软件只在 Windows 上运行&#xff0c;例如&#xff1a;PotPlayer&#xff0c;那么该如何在 Ubuntu 系统中使用到这些 Windows 的软件呢&#xff1f;答案是安装 wine。 简单的安装步骤如…