使用两个队列实现一个栈【数据结构】

2023-10-26

使用两个队列实现一个栈

StackByQueue.h

typedef int SQDataType;
typedef struct StackByQueue
{
	Queue q1;
	Queue q2;

}StackByQueue;

void InitStackByQueue(StackByQueue* s);
void PushStackByQueue(StackByQueue* s, SQDataType data);
int StackByQueueEmpty(StackByQueue* s);
void PopStackByQueue(StackByQueue* s);
SQDataType TopStackByQueue(StackByQueue* s);
int SizeStackByQueue(StackByQueue* s);

void DestroyStackByQueue(StackByQueue* s);

StackByQueue.c

void InitStackByQueue(StackByQueue* s)
{
	QueueInit(&s->q1);
	QueueInit(&s->q2);
}


void PushStackByQueue(StackByQueue* s, SQDataType data)
{
	//先判断哪个队列不为空,放到该队列,第一个元素在q2
	if (!QueueEmpty(&s->q1))
	{
		QueuePush(&s->q1, data);
	}
	else
	{
		QueuePush(&s->q2, data);
	}
}

int StackByQueueEmpty(StackByQueue* s)
{
	return QueueEmpty(&s->q1) && QueueEmpty(&s->q2);
}

void PopStackByQueue(StackByQueue* s)
{
	if (StackByQueueEmpty(s))
	{
		return;
	}
	//当第q1的元素为空,把q2的前size - 1个元素倒入q1
	if (QueueEmpty(&s->q1))
	{
		while (QueueSize(&s->q2) > 1)
		{
			QueuePush(&s->q1, QueueFront(&s->q2));
			QueuePop(&s->q2);
		}
		QueuePop(&s->q2);			//移除队列2最后一个元素
	}
	else			//q2为空
	{
		while (QueueSize(&s->q1) > 1)
		{
			QueuePush(&s->q2, QueueFront(&s->q1));
			QueuePop(&s->q1);
		}
		QueuePop(&s->q1);
	}
}

SQDataType TopStackByQueue(StackByQueue* s)
{
	if (!QueueEmpty(&s->q1))
	{
		return QueueBack(&s->q1);
	}
	else
	{
		return QueueBack(&s->q2);
	}
}

int SizeStackByQueue(StackByQueue* s)
{
	return QueueSize(&s->q1) + QueueSize(&s->q2);
}

void DestroyStackByQueue(StackByQueue* s)
{
	QueueDestroy(&s->q1);
	QueueDestroy(&s->q2);
}

void TestStackByQueue()
{
	StackByQueue s;
	InitStackByQueue(&s);
	PushStackByQueue(&s, 1);
	PushStackByQueue(&s, 2);
	PushStackByQueue(&s, 3);
	PushStackByQueue(&s, 4);
	printf("****************push************************\n");
	printf("size = %d\n", SizeStackByQueue(&s));
	printf("top = %d\n", TopStackByQueue(&s));
	PushStackByQueue(&s, 1);
	PushStackByQueue(&s, 2);
	PushStackByQueue(&s, 3);
	PushStackByQueue(&s, 4);
	printf("****************push************************\n");
	printf("size = %d\n", SizeStackByQueue(&s));
	printf("top = %d\n", TopStackByQueue(&s));
	PopStackByQueue(&s);
	printf("****************pop************************\n");
	printf("size = %d\n", SizeStackByQueue(&s));
	printf("top = %d\n", TopStackByQueue(&s));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用两个队列实现一个栈【数据结构】 的相关文章

  • weex实践初探

    weex是阿里2016年开源的项目 号称通过撰写HTML CSS JavaScript来开发原生android ios的UI界面 并且接近原生的性能体验 写一次 多端编译 一直是无线移动追求的目标 既然阿里牛皮吹得这么大 本人也非常迫切体验
  • EncodedResource类解读

    EncodedResource类解读 EncodedResource介绍 EncodedResource是spring中Resource编码相关的封装类 EncodedResource里面封装了一个Resource成员属性 其实主要功能就是

随机推荐

  • MySQL索引类型与索引原理

    1 索引类型 索引可以提升查询速度 会影响where查询 以及order by排序 MySQL索引类型如下 从索引存储结构划分 B Tree索引 Hash索引 FULLTEXT全文索引 R Tree索引 从应用层次划分 普通索引 唯一索引
  • Uncaught ReferenceError: xxx is not defined at HTMLInputElement.onclick已解决

    触发标签的onclick事件报错如下 Uncaught ReferenceError http is not defined at HTMLInputElement onclick list do pageType initialize 2
  • Flutter1.0入门基础

    Flutter1 0入门基础 注 原课程视频是基于Flutter1的 目标 开发入门 工具 环境搭建 入门必备 开发技巧 导航框架 常用功能 开发流程 网络 数据存储 列表 Flutter与Native混编 工程封装 模块开发 AI结合 项
  • java初始化map的四种方式

    第一种 最常见的方式 新建Map对象 public class Demo private static final Map
  • extern指针和数组的用法

    对extern我们先来一段直白的告白 extern是计算机语言中的一个函数 可置于变量或者函数前 以表示变量或者函数的定义在别的文件中 提示编译器遇到此变量或函数时 在其它模块中寻找其定义 另外 extern也可用来进行链接指定 来自百度百
  • 毕业设计:电子/通信/物联网/计算机专业选题目参考(嵌入式linux/单片机STM32/web/图像)

    本文推荐的毕业设计题目涉及以下技术 嵌入式Linux 单片机STM32 Opencv Qt Web 百度AI YOLO 目标检测 深度学习 等 适用于 电子信息 通信 物联网 计算机 等专业的毕业设计题目 支持服务 题目定制 选题答疑 代做
  • Android自定义View实现图片裁剪功能(本地选择图片进行裁剪)

    使用安卓自带的裁剪工具 发现有版本兼容问题 而且图片模糊问题也不好解决 于是自己动手绘制一个裁剪工具 先看效果 最终效果 自定义截图 实现思路 打开本地相册 获得图片Uri Uri转为Bitmap 用自定义View绘制可拖动选框 获得用户的
  • PhotonServer游戏服务器学习一

    步骤一 1 PhotonServe的官方网站https www photonengine com zh CN Photon 进入到官网后点击SDKs 选择Server 工程 点击SeverSDK ON PREMISES进行下载 需要注册一个
  • JDBC连接Access数据库的几种方式介绍

    接下来总结一下常用的几种连接方式 例如有如下的Access数据库student 表basic 以及6条记录 现在通过几种方式在Jsp中将他们的数据显示出来 如图所示 对于几种连接Access数据库的方式 基本上都是基于JDBC ODBC方式
  • 关于pytorch、torch_geometric安装 22.12.25

    系统坏了 重装系统 一开始以为电脑只能装cuda9 2版本一下 装了之后 显卡驱动自动更新了 然后显示可以装CUDA11 7版本一下 cuda 9 2 torch geometric 1 61 pytorch 1 6 0 python3 8
  • Linux 根目录爆掉,怎么办?

    极力推荐文章 欢迎收藏Android 干货分享 本篇文章主要介绍 Linux 开发中的部分知识点 通过阅读本篇文章 您将收获以下内容 一 cannot create temp file for here document No space
  • WebStorm 2023 下载、安装、汉化

    1 下载WebStorm 1 1 官网下载地址 https www jetbrains com webstorm https www jetbrains com webstorm download download thanks html
  • 问题解决:DatabaseMetaData.getTables()方法,返回了所有库中的表

    一 问题描述 DatabaseMetaData getTables 方法常常用来获取数据库中的所有表信息 但我想要获取我的本地数据库db test中的表信息 出现了错误 try Connection conn DBManager getCo
  • BigDecimal保留小数

    Java中BigDecimal取整方法 BigDecimal bd new BigDecimal 12 1 long l bd setScale 0 BigDecimal ROUND UP longValue 向上取整 long l bd
  • 【Docker存储】Docker容器的数据持久化

    Docker存储 Docker容器的数据持久化 一 Docker数据持久化方式 二 本次实践介绍 2 1 本次实践简介 2 2 本次实践环境介绍 三 容器的挂载目录 3 1 创建测试容器web01 3 2 查看容器信息 3 3 编辑测试文件
  • 单片机C语言中while(1)的问题

    单片机C语言的主程序 通常要用一个while 1 语句来让程序进入一个无限循环 目的是为了让程序一直保持在我们需要运行的情况下 虽然这种做法毋庸置疑 在网上还是有不少朋友有疑问 如果程序不加while 1 会出现什么情况 对于这种好学精神
  • Android开发——相册的访问、上传以及服务端对接

    相册的访问与图片保存 1 访问相册并上传到服务器 2 下载网络图片到相册 3 这里顺便分享一手后端的对接方法 4 生产环境资源配置 5 后端项目打包 一般Android开发需要涉及到本地相册的上传以及文件下载到相册 1 访问相册并上传到服务
  • redis必杀命令:发布订阅

    Redis 发布订阅 pub sub 是一种消息通信模式 发送者 pub 发送消息 订阅者 sub 接收消息 Redis 客户端可以订阅任意数量的频道 下图展示了频道 channel1 以及订阅这个频道的三个客户端 client2 clie
  • Spotify 一款不错的音乐工具

    Spotify简介 在这个时代 似乎听歌已经成了我们生活中不可缺少的一部分 生活中或多或少的我们都能接触到的 但每个人喜欢的风格是不一样的 又或者我们喜欢的歌曲可能因为种种的原因而听不见 那么下面这款工具就基本上能满足我们对歌曲的渴望 在这
  • 使用两个队列实现一个栈【数据结构】

    使用两个队列实现一个栈 StackByQueue h typedef int SQDataType typedef struct StackByQueue Queue q1 Queue q2 StackByQueue void InitSt