用队列和栈分别实现栈和队列

用队列实现栈
题目解读

在这里插入图片描述
本题的要求是要用两个队列来实现一个先进后出的栈,并且要有以下功能:
1.将元素压入栈中
2.移除栈顶元素并且返回他
3.返回栈顶元素
4.判断栈是否为空

题目构思和代码实现

我们首先要做的就是将实现队列的代码导入该题(也可以自己写)
下面我们来进行题目的构思:
我们知道,栈的增加和删除元素都是从栈顶进行操作的,并且遵循先进后后出的原则,但是队列是遵循先进先出的规则,增加元素从队尾增加,删除元素从队首删除。
怎么解决呢?
其实题目已经给了我们提示:用两个队列!
我们可以这样,先构造两个队列,一个用来删除栈的元素,一个用来增加栈的元素。
所以我们就可以开辟两个队列,一个叫pop,一个叫push

typedef struct 
{Queue push;Queue pop;
} MyStack;MyStack* myStackCreate() 
{MyStack* obj=(MyStack*)malloc(sizeof(MyStack));if(obj==NULL){return NULL;}QueueInit(&obj->push);QueueInit(&obj->pop);return obj;
}

我们需要将元素压入栈中是就看哪一个队列不为空就压入到那个队列中
我们用之前队列写的判断队列 是否为空来增加代码的可读性

void myStackPush(MyStack* obj, int x) 
{if(!QueueEmpty(&obj->push)){QueuePush(&obj->push,x);}else{QueuePush(&obj->pop,x);}
}

移除栈中的元素就要看情况了:
我们首先假设push队列为空,pop队列不为空,然后再用一个if语句进行判断,如果push不为空就交换
然后我们将不为空的那个队列里面的除了队尾元素的所有元素都统统放入为空的那个队列里面,知道不为空队列里面只剩下一个元素,先存储这个元素,然后就直接将他删除,最后返回这个元素
在这里插入图片描述

int myStackPop(MyStack* obj) 
{Queue* empty=&obj->push;Queue* nonempty=&obj->pop;if(!QueueEmpty(&obj->push)){empty=&obj->pop;nonempty=&obj->push;}while(QueueSize(nonempty)>1){QueuePush(empty,QueueFront(nonempty));QueuePop(nonempty);}int top=QueueFront(nonempty);QueuePop(nonempty);return top;
}

返回栈顶元素就直接返回非空队列的队尾元素即可

nt myStackTop(MyStack* obj) 
{if(!QueueEmpty(&obj->push)){return QueueBack(&obj->push);}else{return QueueBack(&obj->pop);}
}

栈为空时两个队列都为空

bool myStackEmpty(MyStack* obj) 
{return QueueEmpty(&obj->pop)&&QueueEmpty(&obj->push);
}

完整代码如下:

typedef struct 
{Queue push;Queue pop;
} MyStack;MyStack* myStackCreate() 
{MyStack* obj=(MyStack*)malloc(sizeof(MyStack));if(obj==NULL){return NULL;}QueueInit(&obj->push);QueueInit(&obj->pop);return obj;
}void myStackPush(MyStack* obj, int x) 
{if(!QueueEmpty(&obj->push)){QueuePush(&obj->push,x);}else{QueuePush(&obj->pop,x);}
}int myStackPop(MyStack* obj) 
{Queue* empty=&obj->push;Queue* nonempty=&obj->pop;if(!QueueEmpty(&obj->push)){empty=&obj->pop;nonempty=&obj->push;}while(QueueSize(nonempty)>1){QueuePush(empty,QueueFront(nonempty));QueuePop(nonempty);}int top=QueueFront(nonempty);QueuePop(nonempty);return top;
}int myStackTop(MyStack* obj) 
{if(!QueueEmpty(&obj->push)){return QueueBack(&obj->push);}else{return QueueBack(&obj->pop);}
}bool myStackEmpty(MyStack* obj) 
{return QueueEmpty(&obj->pop)&&QueueEmpty(&obj->push);
}
用栈实现队列
题目解读

在这里插入图片描述
题目的意思和上一题大同小异,要实现的功能都大差不差的,这里我就不做过多的解读,直接开始构思:

题目构思和代码实现

要想实现队列,我们用两个栈如何实现呢?
首先,栈时遵循先进后出的原则,但是队列时先进先出,难不成也像上一题一样,一个栈用来增加数据,另一个栈用来删除数据?

typedef struct 
{Stack pushstack;Stack popstack;
} MyQueue;MyQueue* myQueueCreate() 
{MyQueue* obj=(MyQueue*)malloc(sizeof(MyQueue));if(obj==NULL){perror("malloc");return NULL;}StackInit(&obj->pushstack);StackInit(&obj->popstack);return obj;
}

其实我们可以这样:
当你要增加元素,就将这个元素压入pushstack也就是专门存储增加队列的增加的元素的
删除元素时就有点麻烦咯
当需要删除时,我们要删除的是最先进入队列的元素,也就是pushstack的栈底元素,那么如何将他删除呢?
我们可以将pushstack的栈顶元素逐个压入到popstack中,然后删除掉pushstack中的栈底元素即可
这里题目中的查找队首元素也可以搭配使用,当pop栈为空时,队首元素就是push栈的栈底元素,pop栈不为空时,就是pop栈的栈顶元素

int myQueuePeek(MyQueue* obj) 
{if(StackEmpty(&obj->popstack)){while(!StackEmpty(&obj->pushstack)){StackPush(&obj->popstack,StackTop(&obj->pushstack));StackPop(&obj->pushstack);}}return StackTop(&obj->popstack);
}

在这里插入图片描述
增加和删除元素代码如下:

void myQueuePush(MyQueue* obj, int x) 
{StackPush(&obj->pushstack,x);
}int myQueuePop(MyQueue* obj) 
{int front=myQueuePeek(obj);StackPop(&obj->popstack);return front;
}

队列的销毁要注意,free掉obj的同时要记得销毁两个栈:

void myQueueFree(MyQueue* obj) 
{StackDestroy(&obj->popstack);StackDestroy(&obj->pushstack);free(obj);
}

完整代码如下:

typedef struct 
{Stack pushstack;Stack popstack;
} MyQueue;MyQueue* myQueueCreate() 
{MyQueue* obj=(MyQueue*)malloc(sizeof(MyQueue));if(obj==NULL){perror("malloc");return NULL;}StackInit(&obj->pushstack);StackInit(&obj->popstack);return obj;
}bool myQueueEmpty(MyQueue* obj) 
{return StackEmpty(&obj->popstack)&&StackEmpty(&obj->pushstack);
}void myQueuePush(MyQueue* obj, int x) 
{StackPush(&obj->pushstack,x);
}int myQueuePeek(MyQueue* obj) 
{if(StackEmpty(&obj->popstack)){while(!StackEmpty(&obj->pushstack)){StackPush(&obj->popstack,StackTop(&obj->pushstack));StackPop(&obj->pushstack);}}return StackTop(&obj->popstack);
}int myQueuePop(MyQueue* obj) 
{int front=myQueuePeek(obj);StackPop(&obj->popstack);return front;
}void myQueueFree(MyQueue* obj) 
{StackDestroy(&obj->popstack);StackDestroy(&obj->pushstack);free(obj);
}

好了,今天的分享到这里就结束了,谢谢大家的支持!

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

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

相关文章

SSM 框架整合

1 整合配置 1.1 流程 1.2 Spring 整合 MyBatis 1.3 Spring 整合 SpringMVC 1.4 配置代码 JdbcConfig.java public class JdbcConfig {Value("${jdbc.driver}")private String driver;Value("${jdbc.url}")private String url;Value("${jdbc.usern…

四、IDEA创建项目时,Maven Archetype模板工程说明

什么是Maven Archetype Archetype是一个Maven项目的模板工具包,它定义了一类项目的基本架构。Archetype为开发人员提供了创建Maven项目的模板,同时它也可以根据已有的Maven项目生成参数化的模板。 官方文档:https://maven.apache.org/archet…

cuda magma 构建 使用cmake构建的步骤记录

这不是群论代数软件,而是cuda 矩阵计算软件 1. 生成其他精度的源代码 1.1 复制编辑 make.inc cp make.inc-examples/make.inc.openblas ./make.inc 并修改其中的定义: OPENBLASDIR ? /opt/OpenBLAS 这需要实现安装openblas到此处。文件夹解构&…

【通讯协议】REST API vs GraphQL

在API设计方面,REST和GraphQL各有缺点。下图显示了 REST 和 GraphQL 之间的快速比较。 REST 使用标准 HTTP 方法(如 GET、POST、PUT、DELETE)进行 CRUD 操作。当您需要在单独的服务/应用程序之间提供简单、统一的接口时,效果很好…

超详细csapp-linklab之第一阶段“输出学号”实验报告

该实验的主题是“链接”。 准备工具 虚拟机,Ubuntu32位,hexedit,main.o,phase1.o,该实验的C代码框架如下 // main.c void (*phase)(); /*初始化为0*/int main( int argc, const char* argv[] ) {if ( phase )(*ph…

链表经典面试题

1 回文链表 1.1 判断方法 第一种(笔试): 链表从中间分开,把后半部分的节点放到栈中从链表的头结点开始,依次和弹出的节点比较 第二种(面试): 反转链表的后半部分,中间节…

leetcode刷题详解五

117. 填充每个节点的下一个右侧节点指针 II 关键点:先递归右子树 画一下就知道了,画一个四层的二叉树,然后右子树多画几个节点就知道为啥了 Node* connect(Node* root) {if(!root || (!root->left && !root->right)){return ro…

实战oj题——括号匹配问题

前言:前面我们已经做了一些关于顺序表和链表的oj题,今天我们就来解决一些有关于栈和队列的oj题。 我们对这个题看起来毫无头绪,但是我们刚学习了栈,就可以用栈来解决这一类问题,如果我们读取到左括号就入栈&#xff0c…

2023年最新Visual Studio下载安装以及C语言环境搭建教程(含C语言入门教程)

文章目录 写在前面C语言简介Visual Studio简介Visual Studio安装教程 C语言入门Visual Studio使用教程 写在后面 写在前面 2023年最新Visual Studio下载安装以及C语言环境搭建教程来啦!一起来看看吧~ C语言简介 C语言是一种高级编程语言,由美国贝尔实…

90. 打家劫舍II (房子围成一圈)

题目 题解 class Solution:def rob(self, nums: List[int]) -> int:def dp(nums: List[int]) -> int:N len(nums)# 定义状态:dp[i]表示从第i个房屋开始偷窃,能够偷到的最高金额dp [0 for i in range(N)]for i in range(N-1, -1, -1):if i N-1:…

uiautomator2 无法连接 ATX-Agent

最近需要写个安卓自动项目,本身不想用appium 。主要是appium需要安装的依赖太多,一单换个环境又要配置新的环境。但是ATX-Agent装好之后怎么都连接不是。 报错信息如下: .........省略............ uiautomator2.exceptions.GatewayError: (…

渗透测试【一】:渗透测试常见问题

渗透测试【一】:渗透测试常见问题 1、问题清单2、问题现象及解决办法2.1、点击劫持2.2、用户枚举2.3、Springboot未授权访问2.4、Swagger未授权访问2.5、Host头注入2.6、任意文件上传2.7、敏感路径泄露2.8、跨域资源共享2.9、Spring Cloud Gateway RCE2.10、Content…

【挑战业余一周拿证】CSDN官方课程目录

一、亚马逊云科技简介 二、在云中计算 三、全球基础设施和可靠性 四、联网 五、存储和数据库 六、安全性 七、监控和分析 八、定价和支持 九、迁移和创新 十、云之旅 关注订阅号 CSDN 官方中文视频(免费):点击进入 一、亚马逊云科…

女生儿童房装修:原木上下铺搭配粉色调。福州中宅装饰,福州装修

你是否正在为女生儿童房的装修而发愁呢?该如何让房间既适合孩子生活,又能够满足日常学习的需要呢?这里有一个精美的装修案例,或许能够为你提供一些灵感。 1️⃣ 原木上下铺 房间的上下铺采用了原木色调,带来了自然、温…

STM32 F1 串口空闲中断 + DMA实现数据发送

DMA实现数据发送 文章目录 DMA实现数据发送前言一、DMA二、代码编写1.DMA2.USART3.main 前言 当你遇到通信数据量大的时候,可以使用 空闲中断 DMA 的方案来减轻 CPU 的压力。 或者 在进行stm32开发时,有时会遇到这种情况:需要在设备间进行数…

1.1 C语言之入门:使用Visual Studio Community 2022运行hello world

1.1 使用Visual Studio Community 2022运行c语言的hello world 一、下载安装Visual Studio Community 2022 与 新建项目二、编写c helloworld三、编译、链接、运行 c helloworld1. 问题记录:无法打开源文件"stdio.h"2. 问题记录:调试和执行按钮…

【Linux】bash 终端指令

进程 $ ps aux | grep pwd work 63317 0.0 0.0 51192 612 pts/9 S 14:22 0:00 grep /home/work/search/1000000.dyenv-user-diaoyan-baiseCliPlus-baisePlus-195522.diaoyan.yq/ala-ac/output_root端口 查看本机端口开放情况 netstat -tln | grep :31 tcp …

Unsupervised Skill Discovery via Recurrent Skill Training论文笔记

Zheyuan Jiang, Jingyue Gao, Jianyu Chen (2022). Unsupervised Skill Discovery via Recurrent Skill Training. In Conference on Neural Information Processing Systems (NeurIPS), 2022. 通过循环技能训练发现无监督技能 1、Motivation 以往的无监督技能发现方法主要使…

可燃气体监测仪助力燃气管网安全监测,效果一览

城市地下管线是指城市范围内供应水、排放水、燃气等各类管线及其附属设施,它们是保障城市正常运转的重要基础设施且影响着城市生命线。其中燃气引发的事故近些年不断增加,由于燃气管线深埋地下环境复杂,所以仅仅依赖人工巡查难以全面有效地防…

17. Python 数据库操作之MySQL和SQLite实例

目录 1. 简介2. 使用PyMySQL2. 使用SQLite 1. 简介 数据库种类繁多,每种数据库的对外接口实现各不相同,为了方便对数据库进行统一的操作,大部分编程语言都提供了标准化的数据库接口,用户不需要了解每种数据的接口实现细节&#x…