LeetCode232. 用栈实现队列

news2024/11/23 21:03:49

232. 用栈实现队列

  • 描述
  • 示例
  • 解题思路以及代码

描述

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):

实现 MyQueue 类:

void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false
说明:

你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

示例

示例 1:

输入:
[“MyQueue”, “push”, “push”, “peek”, “pop”, “empty”]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 1, 1, false]

解释:
MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false

解题思路以及代码

定义两个栈,一个进栈,一个出栈,有数据进入全部放到进栈里,如果出数据,就出出栈的数据,如果出栈数据为空,就把入栈数据导到出栈里。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

typedef int STDatatype;
typedef struct STNode
{
	STDatatype* a;
	int top;
	int capacity;
}STNode;

//初始化LeetCode
void StackInit(STNode* ps)
{
	assert(ps);
	ps->a = NULL;
	ps->top = ps->capacity = 0;
}

//销毁
void StackDestroy(STNode* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->top = ps->capacity = 0;
}

//打印
void StackPrint(STNode* ps)
{
	assert(ps);
	for (int i = 0; i < ps->top; i++)
	{
		printf("%d ", ps->a[i]);
	}
	printf("\n");
}

//栈空
bool StackEmpty(STNode* ps)
{
	assert(ps);
	return ps->top == 0;
}


//入栈
void StackPush(STNode* ps, STDatatype x)
{
	assert(ps);
	if (ps->top == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
		STDatatype* tmp = (STDatatype*)realloc(ps->a,newcapacity * sizeof(STDatatype));
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity = newcapacity;
	}

	ps->a[ps->top] = x;
	ps->top++;
}


//出栈
void StackPop(STNode* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));
	ps->top--;
}


//栈顶元素
STDatatype StackTop(STNode* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));
	return ps->a[ps->top - 1];
}



//栈元素个数
int StackSize(STNode* ps)
{
	assert(ps);
	return ps->top;
}


typedef struct {
    STNode Push;
    STNode Pop;
} MyQueue;


MyQueue* myQueueCreate() {
    MyQueue* obj=(MyQueue*)malloc(sizeof(MyQueue));
    StackInit(&obj->Push);
    StackInit(&obj->Pop);

    return obj;
}

void myQueuePush(MyQueue* obj, int x) {

    //所有元素都进入Push栈中
    StackPush(&obj->Push,x);
}

void PushToPop(MyQueue* obj)
{
    if(StackEmpty(&obj->Pop))
    {
        while(!StackEmpty(&obj->Push))
        {
            StackPush(&obj->Pop,StackTop(&obj->Push));
            StackPop(&obj->Push);
        }
    }
}

int myQueuePop(MyQueue* obj) {

    PushToPop(obj);
    int ret=StackTop(&obj->Pop);
    StackPop(&obj->Pop);
    return ret;
}

int myQueuePeek(MyQueue* obj) {
    PushToPop(obj);
    return StackTop(&obj->Pop);
}

bool myQueueEmpty(MyQueue* obj) {
   return StackEmpty(&obj->Push) && StackEmpty(&obj->Pop); 

}

void myQueueFree(MyQueue* obj) {
    StackDestroy(&obj->Push);
    StackDestroy(&obj->Pop);
    free(obj);
}

注意最后一个函数不能直接释放obj;原因看这里用队列实现栈最后的解释。

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

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

相关文章

UICollectionView 实现整页翻动(每页3个cell)

提示&#xff1a;页面架构是通过UICollectionView做的分页&#xff0c;分页点PageControl使用的是<SDCycleScrollView/TAPageControl.h> &#xff0c;布局架构使用的是Masonry 前言 为了实现UICollectionView无限翻动&#xff0c;连续滑动&#xff0c;主要是利用pagingE…

海豚1.3单节点,多集群设置

最近出差忙项目&#xff0c;一直没更新&#xff0c;现在项目结尾了。回来继续搞集群 公司因为CDH升级为CDP&#xff0c;两套环境数据和任务慢慢迁移&#xff0c;但是调度任务需要同时跑批。 而我们的海豚调度是单节点的&#xff0c;master和worker等服务都在一台节点上。 之前…

基于VBA实现成绩排序的最佳方法-解放老师的双手

作为一名老师&#xff0c;每到期末就要面对一件让人头疼的事情——成绩表统计。 首先&#xff0c;要收集每个学生的考试成绩。这需要花费大量的时间和精力&#xff0c;因为每个学生都有多门科目的成绩需要统计。 其次&#xff0c;要将每个学生的成绩录入到电子表格中。这看起来…

【今天聊聊生产力】提升研发生产力的神器推荐

1、Free Mybatis Tool、MybatisX 用于DAO层和Mapper层之间跳转 Mapper和DAO层跳转&#xff0c;可以用的插件比较多&#xff0c;比较推荐如下两款&#xff0c;功能基本一致&#xff0c;只是样式小有差别。 Free Mybatis Tool&#xff0c;样式为一个绿色箭头&#xff0c;简洁明了…

docker 部署JAVA应用OOM的排障经历——筑梦之路

故障现象&#xff1a; 使用docker部署JAVA的应用&#xff0c;tomcat作为中间件容器&#xff0c;启动应用时总是报错无法创建Java虚拟机&#xff0c;然后就是OOM 报错信息&#xff1a; 不管是从docker容器的日志还是系统日志均未发现有用的信息&#xff0c;也尝试更换过镜像tom…

C++入门3(C++新特性 using string auto)

C入门3 C新特性auto推导规则auto 作为函数的形参类型decltype基于范围for循环 typedef与usingC语言定义变量typedef 在C语言中的写法using在C11中的写法using与template的结合 string的简单使用 C新特性 auto推导规则 auto类型推导: auto定义的变量&#xff0c;可以根据初始化…

开源推荐,超级棒的云原生的Kafka管控平台,清新优雅~~

哈喽&#xff0c;大家好&#xff0c; 之前给大家介绍过很多优秀的后台管理系统&#xff0c;但是都感觉还少&#xff0c;今天再来推荐一个。 最近新接触到一个项目&#xff0c;确实把我惊艳到了&#xff0c;太适合使用了&#xff0c;极大地方便了用户和运维人员的日常使用&…

(三)Kubernetes - 手动部署(二进制方式安装)

Kubernetes - 手动部署 [ 2 ] 1 部署主节点1.1 生成kube-apiserver证书1.1.1 自签证书颁发机构(CA)1.1.2 使用自签CA签发kube-apiserver https证书 1.2 下载k8s-server1.3 解压二进制包1.4 部署kube-apiserver1.4.1 创建配置文件1.4.2 拷贝刚才生成的证书1.4.3 启用TLS bootstr…

部署PHP开源项目SuiteCRM

部署PHP开源项目SuiteCRM 前言部署PHP项目创建站点上传PHP源码安装依赖 SuiteCRM安装安装向导中文语言修改数据库密码 前言 因人力资源部想要开发一套适用于他们方便管理的系统&#xff0c;但无整体构思&#xff0c;在网络中找到了开源企业管理软件SuiteCRM&#xff0c;想要作为…

基于SSM框架疫情之下社区管理系统(spring+springmvc+mybatis+jsp+jquery+bootstrap)

一、项目简介 本项目是一套基于SSM框架疫情之下社区管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c…

Java8新特性—Lambda表达式

Java 8是Java编程语言的一个版本&#xff0c;于2014年发布。它引入了许多新的特性和改进。 Lambda表达式是Java 8中引入的一个重要的新特性&#xff0c;它提供了一种更加简洁、灵活的方式来编写函数式接口的实现&#xff0c;从而提高了代码的可读性和简洁性。 在本文中&#…

什么是FPGA?关于FPGA基础知识 一起来了解FPGA lattice 深力科 MachXO3系列 LCMXO3LF-9400C-5BG256C

什么是FPGA&#xff1f;关于FPGA基础知识 一起来了解FPGA lattice 深力科 MachXO3系列 LCMXO3LF-9400C-5BG256C FPGA基础知识&#xff1a;FPGA是英文Field&#xff0d;Programmable Gate Array的缩写&#xff0c;即现场可编程门阵列&#xff0c;它是在PAL、GAL、CPLD等可编程器…

golang web学习随便记2

在前一篇中&#xff0c;我们直接在 index 这个 handler func 中解析了模板&#xff0c;定义了数据&#xff0c;然后执行模板显示“拼合”了数据的网页。这是一个客户被动看的页面。实际的应用显然需要能够处理用户的请求。对于浏览器客户端的请求&#xff0c;我们先要来了解和请…

pytorch——损失函数之nn.BCELoss二进制交叉熵和 nn.BCEWithLogitsLoss

文章目录 1、pytorch损失函数之nn.BCELoss()&#xff08;二进制交叉熵)1.1 是什么&#xff1f;1.2 怎么代码实现和代码使用&#xff1f;1.3 推导过程分析交叉熵作为损失函数的梯度情况&#xff1a;举一个sigmoid导致的梯度消失的MSE损失的例子 1.3 应用场景1.3.1 二分类1.3.2 多…

java版工程项目管理系统平台,助力工程企业实现数字化管理系统源代码

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示1…

一文讲透TCP/IP协议 | 图解+秒懂+史上最全

目录 &#x1f64b;‍♂️ TCP/IP协议详解 &#x1f64b;‍♂️ TCP/IP协议的分层模型 OSI模型的七层框架 TCP/IP协议与七层ISO模型的对应关系 &#xff08;一&#xff09;TCP/IP协议的应用层 &#xff08;二&#xff09;TCP/IP协议的传输层 &#xff08;三&#xff09;…

Vuex从了解到实际运用(二)——获取vuex中的全局状态(state getters)

vuex从了解到实际运用——获取vuex中的全局状态state getters 知识回调&#xff08;不懂就看这儿&#xff01;&#xff09;场景复现项目实战vuex定义一个store实例在store中定义数据在组件中获取值vuex的计算属性通过getters获取全局状态state和getters获取全局状态的区别 知识…

Windows安装Docker 容器教程

Windows安装Docker 容器教程 什么是docker I. 简介 什么是 Docker 容器 Docker 容器是一种轻量级、可移植、自包含的软件打包和部署技术。它可以将应用程序和依赖项打包在一个可移植的容器中&#xff0c;并提供一个一致的运行环境&#xff0c;无论在哪个计算机上运行都能够…

Copyleaks:AI抄袭和内容检测工具

【产品介绍】 Copyleaks是一个基于AI人工智能的抄袭和内容检测工具&#xff0c;可以帮助用户在互联网上发现和防止内容被盗用。支持检测各种类型的文本&#xff0c;包括学术论文、网站内容、商业文件、法律合同、创意作品等&#xff0c;并提供详细的相似度报告和原始来源链接。…

基于R语言APSIM模型应用

随着数字农业和智慧农业的发展&#xff0c;基于过程的农业生产系统模型在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农田固碳和温室气体排放等领域扮演着越来越重要的作用。APSIM (Agricultural Production Systems sIMulator)模型是世界知名的作物生…