当前位置: 首页 > news >正文

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

相关文章:

  • Windows安装MySQL(8.0.37)
  • css-Echarts图表柱状图,X轴横坐标值显示不完全问题
  • OSPF被动接口配置(华为)
  • Trying to access array offset on value of type null
  • 贝锐蒲公英异地组网方案:实现制药设备远程监控、远程运维
  • 【STM32进阶笔记】GPIO端口
  • 多路h265监控录放开发-(8)完成摄像机管理的修改和删除功能
  • 开源【汇总】
  • from import *
  • 【linux】内核源码TCP->IP->L2层函数调用继续摸索中
  • win10修改远程桌面端口号,在Windows 10中修改远程桌面端口号的步骤
  • 数据库新技术【分布式数据库】
  • 信息安全、网络安全、网络空间安全傻傻分不清?
  • python18 正则表达式
  • ubuntu查看当前系统版本
  • 【刷算法】求1+2+3+...+n
  • JavaScript 基本功--面试宝典
  • java正则表式的使用
  • js递归,无限分级树形折叠菜单
  • Laravel 菜鸟晋级之路
  • leetcode388. Longest Absolute File Path
  • Linux各目录及每个目录的详细介绍
  • mysql中InnoDB引擎中页的概念
  • vue数据传递--我有特殊的实现技巧
  • 从伪并行的 Python 多线程说起
  • 高度不固定时垂直居中
  • 关于Flux,Vuex,Redux的思考
  • 记一次用 NodeJs 实现模拟登录的思路
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 前端技术周刊 2019-01-14:客户端存储
  • 山寨一个 Promise
  • 小程序开发中的那些坑
  • 赢得Docker挑战最佳实践
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​Java并发新构件之Exchanger
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ‌U盘闪一下就没了?‌如何有效恢复数据
  • # .NET Framework中使用命名管道进行进程间通信
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #控制台大学课堂点名问题_课堂随机点名
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (31)对象的克隆
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (LeetCode C++)盛最多水的容器
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (黑马点评)二、短信登录功能实现
  • (力扣)循环队列的实现与详解(C语言)
  • (六)DockerCompose安装与配置
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (五)activiti-modeler 编辑器初步优化