【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的所有数据到ostSTPush(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.rhkb.cn/news/356783.html

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

相关文章

尚品汇-(四)

&#xff08;1&#xff09;商品的基本知识 1.1基本信息—分类 一般情况可以分为两级或者三级。咱们的项目一共分为三级&#xff0c;即一级分类、二级分类、三级分类。 比如&#xff1a;家用电器是一级分类&#xff0c;电视是二级分类&#xff0c;那么超薄电视就是三级分类。…

《计算机英语》 Unit 5 Networking 网络

Section A Networking 网络 The need to share information and resources among different computers has led to linked computer systems, called networks, in which computers are connected so that data can be transferred from machine to machine. 不同计算机之间共享…

路由器基础配置以及静态路由配置

1、搭建网络 搭建网络拓扑、分配IP地址、划分网段、连接端口 2、配置路由器 路由器基础配置 //进入全局配置模式 Router#enable Router#conf t Enter configuration commands, one per line. End with CNTL/Z.//配置高速同步串口serial2/0 Router(config)#int ser2/0 Route…

Linux-Https协议

文章目录 前言一、Https协议二、常见的加密方式对称加密非对称加密数据摘要&&数据指纹中间人攻击 三、Https的加密历程方案1-只使用对称加密方案2-只使用非对称加密方案3-双方都使用非对称加密方案4-非对称加密对称加密 四、CA证书什么是CA证书CA证书的合法性如何生成.…

学习笔记——路由网络基础——动态路由

五、动态路由 1、动态路由概述 动态路由&#xff1a;通过在设备上运行某种协议&#xff0c;通过该协议自动交互路由信息的过程。 动态路由协议有自己的路由算法&#xff0c;能够自动适应网络拓扑的变化&#xff0c;适用于具有一定数量三“层设备的网络。 动态路由协议适用场…

深入理解redis持久化—AOF日志

redis为什么需要持久化 redis是内存数据库&#xff0c;redis所有的数据都保存在内存中 如果此时pc关机或重启&#xff0c;那么内存中的用户数据岂不是丢失了&#xff1f;redis这么不安全吗&#xff1f; 作为数据库&#xff0c;保证数据的安全&#xff0c;持久是基本需求&…

【Linux】进程间通信3——system V共享内存

1.system V进程间通信 管道通信本质是基于文件的&#xff0c;也就是说操作系统并没有为此做过多的设计工作&#xff0c;而system V IPC是操作系统特地设计的一种通信方式。但是不管怎么样&#xff0c;它们的本质都是一样的&#xff0c;都是在想尽办法让不同的进程看到同一份由操…

idea导入文件里面的子模块maven未识别处理解决办法

1、File → Project Structure → 点击“Modules” → 点击“” → “Import Model” 2、可以看到很多子模块&#xff0c;选择子模块下的 pom.xml 文件导入一个一个点累死了&#xff0c;父目录下也没有pom文件 解决办法&#xff1a;找到子模块中有一个pom.xml文件&#xff0c;…

Redis 主从同步

主从同步 很多企业没有使用Redis的集群&#xff0c;但是至少都做了主从。有了主从&#xff0c;当master挂掉的时候&#xff0c;运维让从库过来接管&#xff0c;服务就可以继续&#xff0c;否则master需要经过数据恢复和重启的过程&#xff0c;可能会拖很长时间&#xff0c;影响…

web-原生Ajax

概念: Asynchronous JavaScript And XML&#xff0c;异步的JavaScript和XML。 作用: 数据交换:通过Ajax可以给服务器发送请求&#xff0c;并获取服务器响应的数据。 异步交互:可以在不重新加载整个页面的情况下&#xff0c;与服务器交换数据并更新部分网页的技术&#xff0c;如…

MySQL—索引—基础语法

目录 一、创建、查看以及删除索引的语法 &#xff08;1&#xff09;创建索引 1、1会用到一个关键字&#xff1a;CREATE。 1、2增加索引还可以用到另外一个关键字——ALTER TABLE 表名 ADD INDEX ... 。 2、解释。 &#xff08;2&#xff09;查看索引 1、查看索引需要用到…

FreeCAD中类型机制研究

了解FreeCAD类型机制实现原理&#xff0c;为后续FreeCAD相关工作提供参考。 1.实现原理 FreeCAD系统提供一个最上层的基类BaseClass&#xff0c;该类主要处理类型相关工作&#xff0c;几乎所有的FreeCAD的类直接或间接继承于该类。该类只有唯一个属性Type&#xff0c;Type里面…

kotlin类

一、定义 1、kotlin中使用关键字class 声明类,如果一个类没有类体&#xff0c;也可以省略花括号&#xff0c; 默认为public 类型的&#xff1a; // 这段代码定义了一个公开的、不可被继承的Test类 class Test{} // 没有类体&#xff0c;可以省略花括号 class Test 底层代码&…

【菜狗学前端】uniapp(vue3|微信小程序)实现外卖点餐的左右联动功能

记录&#xff0c;避免之后忘记...... 一、目的&#xff1a;实现左右联动 右->左 滚动&#xff08;上拉/下拉&#xff09;右侧&#xff0c;左侧对应品类选中左->右 点击左侧品类&#xff0c;右侧显示对应品类 二、实现右->左 滚动&#xff08;上拉/下拉&#xff09;右…

利口 202. 快乐数

力扣 202. 快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结…

mac如何检测硬盘损坏 常用mac硬盘检测坏道工具推荐

mac有时候也出现一些问题&#xff0c;比如硬盘损坏。硬盘损坏会导致数据丢失、系统崩溃、性能下降等严重的后果&#xff0c;所以及时检测和修复硬盘损坏是非常必要的。那么&#xff0c;mac如何检测硬盘损坏呢&#xff1f;有哪些常用的mac硬盘检测坏道工具呢&#xff1f; 一、m…

57.SAP MII产品介绍(07)功能详解(06)Workbench-SQLQuery

1.SQLQuery概念 您可以使用SAP Manufacturing Integration and Intelligence&#xff08;SAP MII&#xff09;Workbench中的SQLQuery来创建访问面向SQL的连接器&#xff08;如IDBC连接器&#xff09;的模板。此查询的扩展名为tqsq。 简而言之&#xff0c;SQLQuery就是一段…

嵌入式web 服务器boa的编译和移植

编译环境&#xff1a;虚拟机 ubuntu 18.04 目标开发板&#xff1a;飞凌OKA40i-C开发板&#xff0c; Linux3.10 操作系统 开发板本身已经移植了boa服务器&#xff0c;但是在使用过程中发现POST方法传输大文件时对数据量有限制&#xff0c;超过1M字节就无法传输&#xff0c;这是…

Ansible-Playbook

前置 Playbook介绍 playbook 剧本是由一个或多个“play”组成的列表Playbook 文件是采用YAML语言编写的用户通过ansible命令直接调用yml语言写好的playbook,playbook由多条play组成&#xff0c;每条play都有一个任务(task)相对应的操作,然后调用模块modules&#xff0c;应用在…

Rocky Linux archive下载地址

Index of /vault/rocky/https://dl.rockylinux.org/vault/rocky/