【LeetCode刷题】232.用栈实现队列

news2024/10/7 3:14:57

目录

题目链接

图解思路

整体结构

实现过程

入队列

出队列

实现代码

MyQueue.h

MyQueue.c

stack.h

stack.c

test.c


题目链接

232. 用栈实现队列 - 力扣(LeetCode)


图解思路

整体结构

实现过程

入队列

插入数据时,插入到ist。

出队列

删除数据时,要求先入先出,解决方法是先看看ost有没有数据(第一次出队列一定没有数据,不需要看),没有就把ist的数据全部搬到ost,这样刚好把数据的顺序反过来,就可以先入先出了。


实现代码

MyQueue.h

#pragma once
#include"Stack.h"

//定义“栈实现的队列”的结构体
typedef struct
{
	Stack* ist;//进数据的栈
	Stack* ost;//出数据的栈
} MyQueue;

//创建队列
MyQueue* myQueueCreate();
//释放队列
void myQueueFree(MyQueue* q);
//入队列
void myQueuePush(MyQueue* q, STDataType x);
//出队列
STDataType myQueuePop(MyQueue* q);
//查看队头数据
STDataType myQueuePeek(MyQueue* q);
//查看是否空
bool myQueueEmpty(MyQueue* q);

MyQueue.c

#include"MyQueue.h"

//创建队列
MyQueue* myQueueCreate()
{
	MyQueue* q = (MyQueue*)malloc(sizeof(MyQueue));//申请队列空间
	if (NULL == q)//malloc失败退出程序
	{
		perror("malloc failed");
		exit(-1);
	}
	//调用Stack.h的函数初始化栈成员
	q->ist = STCreate();
	q->ost = STCreate();
	return q;//返回初始化好的队列的指针
}

//释放队列
void myQueueFree(MyQueue* q)
{
	assert(q);
	//调用Stack.h的函数释放栈成员
	STDestroy(q->ist);
	STDestroy(q->ost);
	free(q);//释放队列空间
}

//入数据
void myQueuePush(MyQueue* q, STDataType x)
{
	assert(q);
	STPush(q->ist, x);//入数据到ist
}

//出数据
STDataType myQueuePop(MyQueue* q)
{
	assert(q);
	assert(!myQueueEmpty(q));//检查非空,空则没有数据可出
	if (STEmpty(q->ost))//ost为空,先移动ist的所有数据到ost,再出ost的数据
	{
		while (!STEmpty(q->ist))//移动ist的所有数据到ost
			STPush(q->ost, STPop(q->ist));
	}
	return STPop(q->ost);//ost不为空,直接出ost的数据
}

//查看队头数据
STDataType myQueuePeek(MyQueue* q)
{
	assert(q);
	assert(!myQueueEmpty(q));//检查非空,空则没有队头数据
	if (STEmpty(q->ost))//ost为空,先移动ist的所有数据到ost,再查看ost的栈顶数据
	{
		while (!STEmpty(q->ist))
			STPush(q->ost, STPop(q->ist));
	}
	return STTop(q->ost);//ost不为空,直接查看ost的栈顶数据
}

//查看是否空
bool myQueueEmpty(MyQueue* q)
{
	assert(q);
	//ist与ost同时为空,队列才空
	return STEmpty(q->ist) && STEmpty(q->ost);
}

stack.h

#pragma once
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>

typedef int STDataType;

typedef struct Stack
{
	STDataType* a;
	int capacity;
	int top;
} Stack;

Stack* STCreate();
void STDestroy(Stack* st);

void STPush(Stack* st, STDataType x);
STDataType STPop(Stack* st);
STDataType STTop(Stack* st);
int STSize(Stack* st);
bool STEmpty(Stack* st);

stack.c

#include"Stack.h"

Stack* STCreate()
{
	Stack* st = (Stack*)malloc(sizeof(Stack));
	if (NULL == st)
	{
		perror("malloc failed");
		exit(-1);
	}
	st->a = NULL;
	st->capacity = st->top = 0;
	return st;
}

void STDestroy(Stack* st)
{
	assert(st);
	free(st->a);
	st->a = NULL;
	st->capacity = st->top =  0;
	free(st);
}

void STPush(Stack* st, STDataType x)
{
	assert(st);
	if (st->capacity == st->top)
	{
		int newcapacity = st->capacity == 0 ? 4 : st->capacity * 2;
		STDataType* temp = (STDataType*)realloc(st->a, sizeof(STDataType) * newcapacity);
		if (NULL == temp)
		{
			perror("realloc failed");
			exit(-1);
		}
		st->a = temp;
		st->capacity = newcapacity;
	}
	st->a[st->top] = x;
	++st->top;
}

STDataType STPop(Stack* st)
{
	assert(st);
	assert(st->top);
	STDataType ret = STTop(st);
	--st->top;
	return ret;
}

STDataType STTop(Stack* st)
{
	assert(st);
	assert(st->top);
	return st->a[st->top - 1];
}

int STSize(Stack* st)
{
	return st->top;
}

bool STEmpty(Stack* st)
{
	assert(st);
	return st->top == 0;
}

test.c

#include <stdio.h>
#include"MyQueue.h"

static void MyQueuePrint(MyQueue* q)
{
	int temp = 0;
	assert(q);
	printf("InStack:");
	temp = STSize(q->ist);
	for (int i = 0; i < temp; ++i)
	{
		printf("%d->", q->ist->a[i]);
	}
	printf("\n");
	printf("OutStack:");
	temp = STSize(q->ost);
	for (int i = 0; i < temp; ++i)
	{
		printf("%d->", q->ost->a[i]);
	}
	printf("\n");
}

void testmyqueue()
{
	MyQueue* q = myQueueCreate();
	MyQueuePrint(q);
	myQueuePush(q, 1);
	myQueuePush(q, 2);
	MyQueuePrint(q);
	myQueuePop(q);
	MyQueuePrint(q);
	myQueuePush(q, 3);
	MyQueuePrint(q);
	printf("delval = %d\n", myQueuePeek(q));
	myQueueFree(q);
}

int main()
{
	testmyqueue();
	return 0;
}

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

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

相关文章

SpringBoot使用AutoConfigure实现依赖库自动导入配置

我们知道导入配置有两种&#xff0c;一种是Value&#xff0c;一种是ConfigurationProperties&#xff0c;将对应的类标记为Component即可导入。但是被注解标识的类创建Bean有一个前提&#xff0c;只对启动类所在的包路径下的所有带有Component等注解的类才会创建Bean。如果我们…

Java智慧工地源码 5G智慧工地系统源码 使用SAAS部署 三维可视化管理,与一线生产过程相融合,集成数据后台,统一前端入口,呈现多方项目信息;

Java智慧工地源码 5G智慧工地系统源码 使用SAAS部署 三维可视化管理&#xff0c;与一线生产过程相融合&#xff0c;集成数据后台&#xff0c;统一前端入口&#xff0c;呈现多方项目信息; 智慧工地是指运用信息化手段&#xff0c;通过三维设计平台对工程项目进行精确设计和施工…

Java程序之素数问题

题目&#xff1a; 判断101-200之间有多少个素数&#xff0c;并输出所有素数。 程序分析&#xff1a; 判断素数的方法&#xff1a;用一个数分别去除2到sqrt(这个数)&#xff0c;如果能被整除&#xff0c;则表明此数不是素数&#xff0c;反之是素数。素数被利用在密码学上&#…

Kubernetes排错(七)-Pod 状态一直 ContainerCreating

查看 Pod 事件 $ kubectl describe pod apigateway-6dc48bf8b6-l8xrw -n cn-staging 异常原因 1&#xff09;no space left on device ... Events:Type Reason Age From Message---- ------ …

移远通信发布高性价比智能模组SC200P系列,赋能金融支付等行业智慧升级

近日&#xff0c;全球领先的物联网整体解决方案供应商移远通信宣布&#xff0c;为满足智慧金融、智能家居、智能穿戴、工业手持等消费和工业应用对高速率、多媒体、长生命周期等终端性能的需求&#xff0c;其正式推出基于紫光展锐UNISOC 7861平台的全新8核4G智能模组SC200P系列…

TypedDict 解析

TypedDict 解析 文章目录 TypedDict 解析1. 类型安全性2. 可读性3. 可维护性TypedDict 的解决方案没有 TypedDict 会发生什么&#xff1f;使用 TypedDict 的优势 TypedDict 应用场景1. 配置文件解析2. API 数据解析3. 数据库记录表示4. 表单数据验证5. 大型团队协作6. 静态类型…

数据可视化在智慧社区中的关键应用

数据可视化能够在智慧社区中发挥重要作用&#xff0c;通过直观和交互的方式将复杂的数据呈现出来&#xff0c;提升社区管理效率&#xff0c;优化居民生活体验&#xff0c;促进社区的可持续发展。在智慧社区中&#xff0c;数据可视化的应用涵盖了安全、环境、能源、交通和公共服…

AI播客下载:Eye on AI(AI深度洞察)

"Eye on A.I." 是一档双周播客节目&#xff0c;由长期担任《纽约时报》记者的 Craig S. Smith 主持。在每一集中&#xff0c;Craig 都会与在人工智能领域产生影响的人们交谈。该播客的目的是将渐进的进步置于更广阔的背景中&#xff0c;并考虑发展中的技术的全球影响…

【React】登录-封装Token的存取删方法--共享复用

在token.js中 // 封装存取方法const TOKENKEY token_keyfunction setToken (token) {return localStorage.setItem(TOKENKEY, token) }function getToken () {return localStorage.getItem(TOKENKEY) }function clearToken () {return localStorage.removeItem(TOKENKEY) }ex…

tensorRT C++使用pt转engine模型进行推理

目录 1. 前言2. 模型转换3. 修改Binding4. 修改后处理 1. 前言 本文不讲tensorRT的推理流程&#xff0c;因为这种文章很多&#xff0c;这里着重讲从标准yolov5的tensort推理代码&#xff08;模型转pt->wts->engine&#xff09;改造成TPH-yolov5&#xff08;pt->onnx-…

微信小程序毕业设计-在线厨艺平台系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

XSS漏洞实验

本篇为xss漏洞实验练习&#xff0c;练习网址来源于网络 练习网址&#xff1a;XSS平台|CTF欢迎来到XSS挑战|XSS之旅|XSS测试 一、前置说明 在测试过程中&#xff0c;有哪些东西是我们可以利用来猜测与判断的&#xff1a; 网页页面的变化&#xff1b;审查网页元素&#xff1b;查…

奇瑞复活经典路虎!中国技术,英国车标,卖向全球

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 6月19日&#xff0c;奇瑞和捷豹路虎宣布签署战略合作意向书&#xff0c;将复活“Freelander神行者”品牌。 小编当课代表&#xff0c;做个简单总结&#xff1a; 英国品牌&#xff0c;中国技术&#xf…

数组 (java)

文章目录 一维数组静态初始化动态初始化 二维数组静态初始化动态初始化 数组参数传递可变参数关于 main 方法的形参 argsArray 工具类sort 中的 comparable 和 comparatorcomparator 比较器排序comparable 自然排序 一维数组 线性结构 静态初始化 第一种&#xff1a;int[] a…

基于uni-app和图鸟UI开发上门服务小程序

一、技术栈选择 uni-app&#xff1a;我们选择了uni-app作为开发框架&#xff0c;因为它基于Vue.js&#xff0c;允许我们编写一次代码&#xff0c;发布到多个平台&#xff0c;包括iOS、Android、Web以及各种小程序。uni-app的丰富组件库、高效的状态管理以及便捷的预览调试功能&…

无霍尔BLDC驱动

目前主要的无霍尔控制方案是基于反电势检测信 息判断换相点,本文研究反电势在 PWM - OFF 点的检 测方案确定换相点。 1. 反电动势检测方案 BLDC 的模型做等效,将线圈阻抗看成是一个 线性电阻和一个储能电感的等效,其等效电路图如图 1所示。 电机三相绕组输出端电压的电压…

【PL理论深化】(3) MI 归纳法:归纳假设 (IH) | 结构归纳法 | 归纳假设的证明

&#x1f4ac; 写在前面&#xff1a;所有编程语言都是通过归纳法定义的。因此&#xff0c;虽然编程语言本身是有限的&#xff0c;但用该语言编写的程序数量是没有限制的&#xff0c;本章将学习编程语言研究中最基本的归纳法。本章我们继续讲解归纳法&#xff0c;介绍归纳假设和…

issues.sonatype.org网站废弃,Maven仓库账号被废弃问题解决

问题起因&#xff1a; 今天自己的项目发布了一个新版本&#xff0c;打算通过GitHub流水线直接推送至Maven中央仓库&#xff0c;结果发现报错 401&#xff0c;说我的账号密码认证失败。我充满了疑惑我寻思难度我的号被盗掉了吗。于是我打开Nexus Repository Manager尝试登录账号…

最新下载:XmanagerXShell【软件附加安装教程】

​相信大家都认同支持IPv6&#xff1a;最近越来越多的公司和国家都采用了IPv6&#xff0c;Xmanager的最新版本v5也加入支持这个功能&#xff0c;无论你是同时使用IPv4和IPv6网络或者完全的IPv6网络&#xff0c;Xmanager 5都可完全满足你的要求&#xff0c;使用MIT Kerberos认证…

Vue41 ref属性

ref属性 ref是Vue提供的获取组件的属性 <template><div><h1 v-text"msg" ref"title"></h1><button ref"btn" click"showDOM">点我输出上方的DOM元素</button><MySchool ref"sch"…