栈和队列的相互实现

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.hqwc.cn/news/703539.html

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

相关文章

使用Rufus制作Ubuntu启动盘(windows同理)

问题 想要做系统,首先需要做启动盘,使用Rufus做启动盘操作简单。 解决 1.下载Rufus 这个软件免费的一搜便是,这里下载:Rufus - 轻松创建 USB 启动盘。下载完成后即点即用1无需安装。 打开 2.下载Ubuntu镜像 下载地址&#xff…

vue-pure-admin项目内复制文字粘贴到word中之后存在边框问题

vue-pure-admin项目内复制文字粘贴到word中之后存在黑色边框是由于reset.scss文件内设置了通配符的border样式 修改前 代码 *, ::before, ::after {box-sizing: border-box;// 添加这个样式会导致复制的文字粘贴到word中带有边框问题border-color: currentColor;border-styl…

Qt运行时,如何设置第一个聚焦的控件

问题:Qt第一个聚焦的控件,如何自行设置? 尝试: 1.在代码中设置 lineEdit->setFocus() 。无效! 2.Qt Designer–打开form1.ui–菜单栏下一行–Edit Tab Order–按顺序点击–菜单栏下一行–Edit Widgets–退出。无效…

架构设计入门(Redis架构模式分析)

目录 架构为啥要设计Redis 支持的四种架构模式单机模式性能分析优点缺点 主从复制(读写分离)结构性能分析优点缺点适用场景 哨兵模式结构优点缺点应用场景 集群模式可用性和可扩展性分析单机模式主从模式哨兵模式集群模式 总结 本文主要以 Redis 为例&am…

【leetcode面试经典150题】-27. 移除元素

88.合并两个有序数组 1 题目介绍1 个人解题思路1.1 解题代码1.2 思路解析 2、分析官方题解2.1 单侧双指针2.2 双侧双指针 1 题目介绍 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外…

Linux之函数应用实例--加法器

一、创建一个对2个整数求和的加法器 首先,定义了一个名为 adder 的 Bash 函数,该函数接受两个参数 $1 和 $2 并输出它们的和。 function adder { echo $[ $1$2 ] } 注意: function 关键字是可选的。在 Bash 中,可以简单地使…

算法练习day4

前言 中间个人原因断了很久,现在回来继续。。。。 两两交换链表中的节点 代码随想录 两两交换链表中的节点 24. 两两交换链表中的节点 - 力扣(LeetCode) (用时:0.3小时) 思路 这道题的思路其实很简单…

IDEA 每次启动都显示选择项目页面

IDEA版本:2021.3.3 打开 Settings > Appearance & Behavior > System Settings 取消勾选 Reopen projects on startup 然后下次启动 IDEA 会显示选择项目页面

立创EDA绘制PCB电路板

1、绘制好原理图后,点击设计---原理图转PCB,生成PCB文件 2、将元器件拖入电路板方框内,摆放布局并使用工具栏布线、放置过孔及丝印 3、然后顶层和底层铺铜 4、后面就可以生成制板文件发送嘉立创制板了。

Python实行任意文件的加密—解密

Python实行任意文件的加密—解密 环 境: 系统:macOS Sonoma IDE:PyCharm 2024 Professional Edition 源代码如下: from cryptography.fernet import Fernet import os# 定义一个加密类 class Encrypt:# 参数是需要被加密的文…

Excel 每 N 列内容填成一行

Excel表格从第 2 列起,每 N 列为一组,以 N2 为例: ABCDEFG1IDType 1Count 1Type 2Count 2Type 3Count 321a640d290a32d12000a1900f600043f48000f3600e160054c46000e3100b120065e47000c3400d140076b64000b3600c1200 现在要进列转行&#xff…

听劝!普通人千万别随意入门网络安全

一、什么是网络安全 网络安全是一种综合性的概念,涵盖了保护计算机系统、网络基础设施和数据免受未经授权的访问、攻击、损害或盗窃的一系列措施和技术。经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”…