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

目录

题目链接

图解思路

整体结构

实现过程

入队列

出队列

实现代码

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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

拦截器Interceptor

概念&#xff1a;是一种动态拦截方法调用的机制&#xff0c;类似于过滤器。Spring框架中提供的&#xff0c;用来动态拦截方法的执行。 作用&#xff1a;拦截请求&#xff0c;在指定的方法调用前后&#xff0c;根据业务需要执行预先设定的代码。

C++实现自动生成c++类中的属性的get和set方法

目录 应用场景 运行准备 代码展示 结果显示 应用场景 当我们在编写类的属性时&#xff0c;需要对该属性进行封装&#xff0c;需要一系列的get和set的方法。例如下面是天气类的成员属性。可以看到属性很多&#xff0c;而写get和set都是一些固定的操作&#xff0c;因此可以直…

stata17中java installation not found或java not recognozed的问题

此问题在于stata不知道去哪里找java,因此需要手动的告诉他 方法1&#xff1a; 1.你得保证已经安装并配置好java环境 2.在stata中输入以下内容并重启stata即可 set java_home "D:\Develope\JDk17" 其中java_home后面的""里面的内容是你的jdk安装路径 我的…

由 Vault 支持的 KES 的 MinIO Operator

为了提供安全锁定和擦除的合规性功能&#xff0c;MinIO 使用服务器端加密 &#xff08;SSE&#xff09; 在存储层加密对象&#xff0c;以保护对象作为写入操作的一部分。MinIO 以极高的效率做到这一点——基准测试表明 MinIO 能够以接近线速进行加密/解密。 MinIO 使用的秘诀是…

Linux htop命令使用

文章目录 简介界面介绍第一行第二行第三行第四行 如何使用 简介 htop 是一个类似于 top 的命令&#xff0c;但具有更丰富的功能和更友好的界面。它可以实时显示系统中各个进程的资源占用情况&#xff0c;如 CPU 使用率、内存使用率等。以下是对 htop 命令的完全解析&#xff1…

vscode插件path-intellisense失效原因

很可能是因为设置中的自动补全部分除了问题。 问题 作者自身是因为使用了copilot之后&#xff0c;感觉vscod自带的自动补全(设置里面叫"建议"&#xff0c;或者inttelisense)就没必要了&#xff0c;然后一通改设置把建议关掉之后发现插件path-intellisense也不能用了…

【C语言】函数指针数组和指向函数指针数组的指针

1 函数指针数组 数组是一个存放相同类型数据的存储空间&#xff0c;那我们已经学习了指针数组。 比如&#xff1a; int *arr[10];//数组的每个元素是int* 那要把函数的地址存到一个数组中&#xff0c;那这个数组就叫函数指针数组&#xff0c;那函数指针的数组如何定义呢&am…

【经验分享】RT600 serial boot mode测试

【经验分享】RT600 serial boot mode测试 一&#xff0c; 文档描述二&#xff0c; Serial boot mode测试2.1 evkmimxrt685_gpio_led_output 工程测试2.2 evkmimxrt685_dsp_hello_world_usart_cm33工程测试 一&#xff0c; 文档描述 RT600的启动模式共支持4种&#xff1a; 1&am…

svm和决策树基本知识以及模型评价以及模型保存

svm和决策树基本知识以及模型评价以及模型保存 文章目录 一、SVM1.1&#xff0c;常用属性函数 二、决策树2.1&#xff0c;常用属性函数2.2&#xff0c;决策树可视化2.3&#xff0c;决策树解释 3&#xff0c;模型评价3.1&#xff0c;方面一&#xff08;评价指标&#xff09;3.2&…

MatLab手把手搭建FOC控制环路(全部使用matlab自带模块)

MatLab手把手搭建FOC控制环路&#xff08;全部使用matlab自带模块&#xff09; Matlab添加模块只需要在空白处双击鼠标左键&#xff0c;输入模块的名字。 添加PMSM模块&#xff1a; Permanent Magnet Synchronous Machine 参数选择&#xff1a; 添加逆变器Two-Level Conver…

Apple - Cryptographic Services Guide

本文翻译自&#xff1a;Cryptographic Services Guide&#xff08;更新时间&#xff1a;2018-06-04 https://developer.apple.com/library/archive/documentation/Security/Conceptual/cryptoservices/Introduction/Introduction.html#//apple_ref/doc/uid/TP40011172 文章目录…

python字符串如何删除后几位

1、首先在jupyter notebook中新建一个空白的python文件&#xff1a; 2、然后定义一个字符串&#xff0c;用字符串截取的方式打印出排除最后三个字符的结果&#xff0c;这里的“s[:-3]”的意思就是从字符串取第0个字符至倒数第三个字符的前一个字符&#xff0c;这样就截取了最后…

别再滥用std::async了,strace命令暴露了一个乱开线程问题

用strace查看进程的系统调用后&#xff0c;发现一个std::async滥用问题 问题现象 进程的系统调用clone次数持续增加 使用工具strace发现进程clone系统调用过多且一直在增加 strace -c -p PID问题分析 clone在做什么&#xff1a;创建进程&#xff08;线程&#xff09; 查看…

基于Redis和openresty实现高并发缓存架构

目录 概述缓存架构设计实践代码路由业务封装redis 效果 概述 本文是对项目中 QPS 高并发相关问题的一种解决方案&#xff0c;利用 Nginx 与 Redis 的高并发、超低延迟响应&#xff0c;结合 Canal 进行实现。 openrestry官网 当程序需要提供较高的并发访问时&#xff0c;往往需…

算出未来——2024年,计算机相关专业仍是热门

随着高考结束&#xff0c;数百万考生和家长们开始着手专业选择与志愿填报。 选择大学专业不仅关乎未来四年的学习生涯&#xff0c;更可能决定一个人一生的职业方向和人生轨迹。 在众多专业中&#xff0c;计算机相关专业因其广泛的就业前景和不断变化的行业需求&#xff0c;一…

tauri中从前端ts调用rust函数,并异步收到响应结果

在前端是可以异步调用rust代码的&#xff0c;而且还是挺简单的逻辑&#xff0c;一共就三步&#xff1a;定义rust函数&#xff0c;注入到invoke_handler中&#xff0c;在前端调用。有英文能力的可以看官方文档&#xff1a;Calling Rust from the frontend | Tauri Apps 没有英文…

C++拷贝构造函数、运算符重载函数、赋值运算符重载函数、前置++和后置++重载等的介绍

文章目录 前言一、拷贝构造函数1. 概念2. 特征3. 编译器生成默认拷贝构造函数4. 拷贝构造函数典型使用场景 二、运算符重载函数三、赋值运算符重载函数1. 赋值运算符重载格式2. 赋值运算符只能重载成类的成员函数不能重载成全局函数3.编译器生成一个默认赋值运算符重载 四、前置…

WebSocket走私实践(附赠LiveGBS监控系统未授权管理员密码重置)

WebSocket走私实践&#xff08;附赠LiveGBS监控系统未授权管理员密码重置&#xff09; 对此&#xff0c;我特别感谢TryHackMe和HackTheBox academy&#xff0c;永远相信和追随英国TryHackMe所教导的网络安全知识,并保持学习 WebSocket走私相关的知识在这里 前段时间学习过htt…

Spring的自动注入(也称为自动装配)

自动注入&#xff08;也称为自动装配&#xff09;是Spring框架中的一个核心概念&#xff0c;它与手动装配相对立&#xff0c;提供了一种更简洁、更灵活的方式来管理Bean之间的依赖关系。 在Spring应用程序中&#xff0c;如果类A依赖于类B&#xff0c;通常需要在类A中定义一个类…

[Redis]缓存常见问题解决(缓存穿透、击穿、雪崩一文解决!通俗易懂、代码实战!手把手教你解决缓存问题三兄弟!)

Redis常见问题解决 要求 只用一种缓存技术&#xff0c;从实验点中挑一些试验进行试验原理。 1.缓存原理 目标&#xff1a;理解缓存的基本原理和工作机制。 实验步骤&#xff1a; 阅读各缓存技术机制的文档和官方资料。实现一个简单的应用程序&#xff0c;模拟数据的读写和…