利用两个栈s1,s2模拟一个队列时,如何用栈的运算来实现该队列的运算?写出模拟队列插入和删除的函数。一个栈s1用于插入元素,另一个栈s2用于删除元素

利用两个栈s1,s2模拟一个队列时,如何用栈的运算来实现该队列的运算?写出模拟队列插入和删除的函数。一个栈s1用于插入元素,另一个栈s2用于删除元素。

前置知识点(栈定义,及出栈入栈函数)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdbool.h>
#define MaxSize 5
typedef struct {int data[MaxSize];//栈中元素int top;//栈顶指针
}SqStack;void InitStack(SqStack* S) {//栈初始化(*S).top = -1;
}bool StackEmpty(SqStack* S) {//判空if ((*S).top == -1) {//栈中无元素return true;}else {return false;}
}bool Pop(SqStack* S, int* x) {//出栈if (S->top == -1) {//栈中无元素return false;}*x = S->data[S->top];S->top--;return true;
}bool Push(SqStack* S, int x) {//入栈if (S->top == MaxSize - 1) {return false;}S->top++;S->data[S->top] = x;return true;
}

模拟入队:

//模拟入队
int EnQueue(SqStack* s1, SqStack* s2,int x) {int tmp = 0;//用于后面出栈带出出栈元素if (s1->top==MaxSize-1) {//s1满了if (!StackEmpty(s2)) {//s2只有满和空两种状态,这里不空就是满了printf("队列已满,入队失败!");return 0;}else {//s2为空,把s1的元素全部赋给它,注意,是全部!while (!StackEmpty(s1)) {Pop(s1, &tmp);Push(s2, tmp);}}Push(s1, x);}else {//s1没满,直接压进去就行了Push(s1, x);}return 1;
}

模拟出队

//模拟出队
int DeQueue(SqStack* s1, SqStack* s2, int* x) {int tmp = 0;//用于后面出栈带出出栈元素if (!StackEmpty(s2)) {//s2不空,直接从s2出Pop(s2, x);return 1;}else {//s2是空的if (StackEmpty(s1)) {//s1也是空的printf("队列已空,出队失败");}else {//s1不空//把s1的元素全部移动到s2, 注意,是全部!while (!StackEmpty(s1)) {Pop(s1, &tmp);Push(s2, tmp);}}}Pop(s2, x);return 1;
}

模拟队列打印函数

void Qprint(SqStack s1,SqStack s2) {//两个栈实现的模拟队列打印int tmp = 0;while (!StackEmpty(&s2)) {//s2不空Pop(&s2, &tmp);printf("%d ", tmp);}while (!StackEmpty(&s1)) {//s1不空,把s1的元素全部移动到s2Pop(&s1, &tmp);Push(&s2, tmp);}while (!StackEmpty(&s2)) {//s2又有元素了,重复上面的操作Pop(&s2, &tmp);printf("%d ", tmp);}
}

入队用例测试

int main() {//入队测试SqStack s1;//每个栈5个大小,最终的队列最大size为10SqStack s2;InitStack(&s1);InitStack(&s2);int x = 0;printf("请输入要入队的元素:");while (scanf("%d", &x) != EOF) {int tmp=EnQueue(&s1, &s2, x);//看看当前是否成功入队if (tmp == 1) {printf("当前队列中元素为:");Qprint(s1, s2);printf("\n");}}printf("\n");return 0;
}

在这里插入图片描述

出队用例测试

int main() {//入队测试SqStack s1;//每个栈5个大小,最终的队列最大size为10SqStack s2;InitStack(&s1);InitStack(&s2);//先入队五个EnQueue(&s1, &s2, 1);EnQueue(&s1, &s2, 2);EnQueue(&s1, &s2, 3);EnQueue(&s1, &s2, 4);EnQueue(&s1, &s2, 5);printf("\n");//出队测试int x = 5;int tmp = 0;while (x) {DeQueue(&s1, &s2, &tmp);printf("已移除队首元素%d ", tmp);printf("当前队列元素为:");Qprint(s1, s2);printf("\n");x--;}return 0;
}

在这里插入图片描述

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

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

相关文章

GORM:在Go中轻松管理数据库

GORM综合介绍 - Go对象关系映射库 在现代软件开发中&#xff0c;高效的数据库管理对于构建强大的应用程序至关重要。GORM是Go开发人员寻求与数据库进行交互的简化方式的宝贵工具。GORM是Go对象关系映射的缩写&#xff0c;它为Go的面向对象世界与数据库的关系世界之间提供了桥梁…

2.2 - 网络协议 - IP协议,IP地址划分,报文格式,数据分片,抓包实战

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 IP协议 1、IP地址划分2、IP协议报文格式3、IP协议数…

设计模式(22)享元模式

一、介绍&#xff1a; 1、定义&#xff1a;享元模式&#xff08;Flyweight Pattern&#xff09;主要用于减少创建对象的数量&#xff0c;以减少内存占用和提高性能。这种类型的设计模式属于结构型模式&#xff0c;它提供了减少对象数量从而改善应用所需的对象结构的方式。 2、…

Windows下多Chrome谷歌浏览器版本共存

场景 某些年代久远的 WEB 应用&#xff0c;必须在指定的浏览器或版本才能正常运行&#x1f602;&#xff0c;此时就需要多个版本 chrome 浏览器共存。 解决方案 下载指定版本 可以从 https://www.chromedownloads.net/ 下载需要的版本&#xff0c;此处下载的是87.0.4280.14…

【Servlet】 一

本文主要介绍了如何在tomcat部署一个webapp 以及 如何借助maven用servlet编写一个hello world . 一.Tomcat Tomcat是一个Java里广泛使用的http服务器 HTTP服务器有很多实现&#xff0c;其中最知名的是Nginx&#xff1b;而在Java里&#xff0c;最知名的是Tomcat 一个Tomcat服务…

快速入手maven

文章目录 Maven介绍Maven安装和配置基于IDEA的Maven工程创建梳理Maven工程GAVP属性Idea构建Maven JavaSE工程Idea构建Maven JavaEE工程1. 手动创建2. 插件方式创建 Maven工程项目结构说明Maven核心功能依赖和构建管理依赖传递和冲突依赖导入失败场景和解决方案扩展构建管理和插…

HDFS架构介绍

数新网络_让每个人享受数据的价值浙江数新网络有限公司是一家开源开放、专注于云数据智能操作系统和数据价值流通的服务商。公司自主研发的DataCyber云数据智能操作系统&#xff0c;主要包括数据平台CyberData、人工智能平台CyberAI、数据智能引擎CyberEngine、数据安全平台Cyb…

振弦传感器智能化:电子标签模块

振弦传感器智能化&#xff1a;电子标签模块 稳控科技研发并批量生产的振弦采集模块解决了传感器由模拟信号直接转变为数字信号的难题。近年来&#xff0c;振弦传感器为适应用户需求&#xff0c;不断迭代更新技术&#xff0c;使学习和使用成本非常低&#xff0c;且带来方便快捷…

创建超过1G内存大小的程序

正常情况一个进程最大占用内存为1G一下&#xff0c;如果程序有需求要使用超过1G大小的程序&#xff0c;可进行如下操作 VS修改设置&#xff1a;属性--->链接器--->系统--->启用大地址 【选择是】 测试申请堆内存代码 #include <stdlib.h> #include <stdio…

redis 网课笔记

缓存 缓存雪崩 缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机&#xff0c;导致大量请求到达数据库。 解决方案 给不同的key的TTL添加随机值利于Redis集群提高服务的可用性 哨兵模式、集群模式给缓存业务添加降级限流策略 ngxin或spring cloud gateway给业务…

05 # 手写 bind

bind 干了什么&#xff1f; 改变 this 指向没有让函数执行&#xff0c;返回一个改变 this 指向后的函数 bind 难点在于参数的收集 手写 bind 简单实现如下&#xff1a; <script>Function.prototype.kaimoBind function (content) {// 获取到 bind 里的剩余参数let …

Linux C语言进阶-D3~D4字符串处理函数

求字符串长度函数strlen、字符串拷贝strcpy、字符串连接strcat、字符串比较strcmp 头文件<string.h> 求字符串长度strlen函数 1、计算字符串长度&#xff0c;并且遇到\0结束&#xff0c;返回字符串长度 2、 计算字符串长度&#xff0c;遇到转义字符&#xff0c;\不算在内…