栈和队列的相互实现

1. 两个队列实现栈. - 力扣(LeetCode)

队列的特点是先进先出,而栈的特点是后进先出(先进后出),也就是说重点在于利用两个队列来改变“出”的顺序。

假设我们在进行入栈操作的时候将数据依次入到一个队列中。

在此基础上,获取栈顶元素比较简单,只需要利用获取队尾元素的接口即可。

但是在出栈时,被删除的栈顶元素为队尾元素,而队列没有相应的删除队尾元素的接口。

于是,我们就可以利用起另一个队列,将队尾元素之前的元素全部出队并入队到另一个队列。

这时,我们就可以对队尾元素进行出队操作了,但是不将其入队到另一个队列中。

这样我们就实现了出栈的操作。

其他的接口都很好实现,我们直接给出代码,其中队列的接口函数详见这篇博客:链队列和循环队列-CSDN博客

typedef struct {Queue q1;Queue q2;
} MyStack;MyStack* myStackCreate() {MyStack* pst = (MyStack*)malloc(sizeof(MyStack));QueueInit(&pst->q1);QueueInit(&pst->q2);return pst;
}void myStackPush(MyStack* obj, int x) {if(!QueueEmpty(&obj->q1)){QueuePush(&obj->q1, x);}else{QueuePush(&obj->q2, x);}
}int myStackPop(MyStack* obj) {Queue* empty = &obj->q1;Queue* nonempty = &obj->q2;if(!QueueEmpty(empty)){nonempty = &obj->q1;empty = &obj->q2;}while(QueueSize(nonempty) > 1){QueuePush(empty, QueueFront(nonempty));QueuePop(nonempty);}int ret = QueueFront(nonempty);QueuePop(nonempty);return ret;
}int myStackTop(MyStack* obj) {if(!QueueEmpty(&obj->q1)){return QueueBack(&obj->q1);}else{return QueueBack(&obj->q2);}
}bool myStackEmpty(MyStack* obj) {return (QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2));
}void myStackFree(MyStack* obj) {QueueDestroy(&obj->q1);QueueDestroy(&obj->q2);free(obj);
}

 2. 两个栈实现队列. - 力扣(LeetCode)

对队列进行操作需要对两端进行操作,而对栈进行操作只能操作一端。

注意到,将一个栈的数据依次转移到另一个队列时,栈的顶为发生了颠倒。

于是,我们用一个栈来对队头进行操作,另一个栈来对队尾进行操作。

据此思路,我们可以完成以下代码,其中栈的接口函数详见这篇博客:栈与递归的实现-CSDN博客 

enum States
{PUSH,POP
};typedef struct {enum States state;Stack sti;//入Stack sto;//出
} MyQueue;MyQueue* myQueueCreate() {MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));obj->state = PUSH;STInit(&obj->sti);STInit(&obj->sto);return obj;
}void myQueuePush(MyQueue* obj, int x) {if(obj->state != PUSH){while(!STEmpty(&obj->sto)){STPush(&obj->sti, STTop(&obj->sto));STPop(&obj->sto);}obj->state = PUSH;}STPush(&obj->sti, x);
}int myQueuePop(MyQueue* obj) {if(obj->state != POP){while(!STEmpty(&obj->sti)){STPush(&obj->sto, STTop(&obj->sti));STPop(&obj->sti);}obj->state = POP;}int ret = STTop(&obj->sto);STPop(&obj->sto);return ret;
}int myQueuePeek(MyQueue* obj) {if(obj->state != POP){while(!STEmpty(&obj->sti)){STPush(&obj->sto, STTop(&obj->sti));STPop(&obj->sti);}obj->state = POP;}int ret = STTop(&obj->sto);return ret;
}bool myQueueEmpty(MyQueue* obj) {return (STEmpty(&obj->sti) && STEmpty(&obj->sto));
}void myQueueFree(MyQueue* obj) {STDestroy(&obj->sti);STDestroy(&obj->sto);free(obj);
}

 

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

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

相关文章

python如何单步调试

Python怎么单步调试?下面给大家介绍一下单步调试: 方法一:执行 python -m pdb myscript.py (Pdb) 会自己主动停在第一行。等待调试,这时你能够看看帮助。 方法二:在所调试程序的开头中:import pdb 并在你…

多线程编程中的隐形杀手:volatile关键字

概述 C中std::mutex本身是一个非volatile类型的对象,但是它保护的共享资源可能需要被volatile修饰,以确保对该资源的修改在不同线程之间的可见性。这种情况通常发生在多线程访问共享数据时,这些数据可能被异步修改,且修改的发生时…

【Vue3笔记03】Vue3项目工程中使用vue-router路由

这篇文章,主要介绍Vue3项目工程中如何使用vue-router路由。 目录 一、vue-router路由 1.1、下载vue-router路由 1.2、创建router.js文件 1.3、main.js配置路由

民航电子数据库:数据库的备份与恢复

目录 前言备份库级逻辑备份示例 恢复库级的逻辑恢复示例 前言 民航电子数据库的备份与恢复 备份 库级逻辑备份 备份目标库下所有的对象 。 因此 ,库级逻辑备份需要由备份库的管理员(SYSDBA)登录至备份目标库进行操作。 语法格式 &#xff1…

商家转账到零钱怎么开通?一步步教你玩转微信营销新利器

在数字化营销日新月异的今天,微信支付凭借其便捷、安全的特点,成为了商家不可或缺的支付工具。而其中的“商家转账到零钱”功能,更是为商家提供了一个全新的营销利器。今天,我们就来详细解读一下如何开通这一功能(我处…

怎么制作流程图?介绍制作方法

怎么制作流程图?在日常生活和工作中,流程图已经成为我们不可或缺的工具。无论是项目规划、流程优化,还是学习理解复杂系统,流程图都能帮助我们更直观地理解和表达信息。然而,很多人可能并不清楚,其实制作流…

通过 Java 操作 redis -- zset 有序集合基本命令

目录 使用命令 zadd,zrange 使用命令 zcard 使用命令 zrem 使用命令 zscore 使用命令 zrank 关于 redis zset 有序集合类型的相关命令推荐看Redis - Zset 有序集合 要想通过 Java 操作 redis,首先要连接上 redis 服务器,推荐看通过 Jav…

出租车在线教育系统,教育机构有哪些岗位,他们的职责是什么?

教育机构成立初期并不需要多少部门多少员工,形成一定规模之后,就要设立以下部门市场部销售部、.教学部、客服部、行政人事部、教务部、客服部,接下来我们看看各部门都有哪些岗位。 一、市场部: A 、经理主管岗位职责 1. 管理深圳区…

探索智慧推理:线上剧本杀小程序引领新潮流

随着科技的飞速发展,线上剧本杀小程序作为一种新兴的数字娱乐形式,正以其独特的魅力引领着新潮流,并在内容创造上展现出无限的潜力。这种融合了角色扮演、推理解谜和社交互动的游戏模式,不仅为用户带来了沉浸式的体验,…

iOS 沙盒图片的存取

简介: 图片的沙盒读存操作主要是增、删、查,一般不涉及改的操作,这里直接以代码演示 常用代码: 增 /*** 存储缩略图到沙盒中*/ (BOOL)saveImageToPath:(NSString *)imageFilePath image:(UIImage *)image{return [UIImageJPEG…

sqlite3报错:database is locked

问题描述: 使用visual studio2022创建动态库,动态库中包含向sqlite3数据库插入数据的函数,在测试函数时偶尔出现database is locked的错误提示。 思路: 1、最开始以为是代码写的有问题,可能对于某些资源没有释放&am…

物流单打印机怎么调格式距离,佳易王物流托运单管理系统软件打印单据左边距调节教程

物流单打印机怎么调格式距离,佳易王物流托运单管理系统软件打印单据左边距调节教程 一、前言 以下软件操作教程以,佳易王物流单打印管理软件为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、佳易王物流单管理系统打印…

Whistle Web Debugging Proxy介绍及使用

大家好,今天继续给大家分享一款抓包工具,这款抓包工具是网页的形式,方便多人访问同时维护。Whistle Web Debugging Proxy是一个用于HTTP、HTTPS、WebSocket等网络协议的跨平台调试工具。它可以帮助开发者对网络请求进行捕捉、分析、修改和重定…

【OpenGL的数学01】从窗口空间计算视空间

文章目录 一、说明二、定义三、来自gl_FragCoord四、来自gl_FragCoord的XYZ4.1 从窗口到ndc4.2 从NDC到剪辑4.3 从剪辑到眼睛4.4 GLSL示例 五、从gl_FragCoord的XYZ优化方法 一、说明 本文将解释如何在给定窗口空间顶点位置的情况下重新计算眼空间顶点位置。以及相反的计算。其…

【Obsidian】视频笔记插件Media Extended的强大功能

我将开设一个专栏,介绍当下最好用的笔记软件Obsidian的使用经验和技巧。欢迎持续关注。 摘要:本文将首先向您介绍一款功能强大的笔记软件Obsidian,然后为您详细解析Obsidian的一款实用插件——Media Extended,帮助您更好地利用Obs…

如何在印度尼西亚成立公司

印度尼西亚共和国,通称“印度尼西亚”或简称“印尼”,为东南亚国家,别号“千岛之国”,实际拥有大小岛屿17508个,以巴厘岛最为闪耀。作为全球最大的群岛国家,印尼地跨南北两个半球、横卧两洋两洲&#xff08…

如何在Mac 电脑上安装 Homebrew

1、打开终端应用程序 在终端中输入以下命令并回车: /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 这个命令会自动下载并运行 Homebrew 的安装脚本。 系统可能会提示您输入管理员密码,请输入您的 Mac 登录…

易图讯科技三维电子沙盘系统

深圳易图讯科技有限公司(www.3dgis.top)创立于2013年,专注二三维地理信息、三维电子沙盘、电子地图、虚拟现实、大数据、物联网和人工智能技术研发,获得20多项软件著作权和软件检测报告,成功交付并实施了1000多个项目&…

十、Redis内存回收策略和机制

1、Redis的内存回收 在Redis中可以设置key的过期时间,以期可以让Redis回收内存,循环使用。在Redis中有4个命令可以设置Key的过期时间。分别为 expire、pexpire、expireat、pexpireat。 1.1、expire expire key ttl:将key的过期时间设置为tt…

QTreeView学习 branch 虚线设置

1、方法一&#xff1a; #include <QStyleFactory> ui.treeView->setStyle(QStyleFactory::create("windows")); 2、方法二&#xff1a; QString strtyle2 R"( QTreeView::branch:has-siblings:!adjoins-item { border-image: url(:/TreeViewDe…