用栈实现队列——leetcode刷题

        题目要求我们只用栈的基本操作 push to top 入栈,peek from top 返回栈顶元素,pop from top 移除并返回栈顶元素,size 栈的大小,is_empty 判断栈是否为空,这几个函数来实现队列,也就是说,我们在队列函数push pop peek empty函数中要调用栈的函数实现。

        首先栈的特点是先进后出,队列的特点是先进先出,如何用两个栈来实现先进先出,我们想到可以把一个栈压入另外一个栈,此时第二个栈的顺序相对第一个就是一个倒序,此时在出栈就是相当于首元素出栈,就相当于队列的逻辑。如图所示,我们还要做的就是把 栈2 的剩余元素重新入栈更新 栈1 。

        我们可以把 栈1 理解为队列的真实情况,栈2 只是出队列时寻找队头的工具(负责逆序栈),每次出队列之后都要重新更新 栈1 ,更新队列。

接下来就是代码实现:

typedef struct {struct Stacklist* p1;struct Stacklist* p2;
} MyQueue;
struct Stacklist* Stackcreat() {struct Stacklist* p = (struct Stacklist*)malloc(sizeof(struct Stacklist));return p;
}
void StackInit(struct Stacklist* stack) {stack->cap = 0;stack->size = 0;stack->val = NULL;
}
MyQueue* myQueueCreate() {MyQueue* list = (MyQueue*)malloc(sizeof(MyQueue));list->p1 = Stackcreat();list->p2 = Stackcreat();StackInit(list->p1);StackInit(list->p2);return list;
}

        首先是Queue队列结构体的成员,两个指向栈的指针:栈1 p1,栈2 p2 。其次是创建队列指针,创建队列中两个栈的指针,对他们进行初始化。(这里使用了题目要求之外的函数,个人感觉不妥,当然可以自己写一下)

接着是入队列函数:

void myQueuePush(MyQueue* obj, int x) {StackPush(obj->p1, x);
}

        直接就是入栈函数,因为进入第一个栈就相当于是入队列了。

然后是出队列函数 Pop(移除元素):

int myQueuePop(MyQueue* obj) {while (!is_empty(obj->p1)) {StackPush(obj->p2, StackPop(obj->p1));}int val = StackPop(obj->p2);while (!is_empty(obj->p2)) {StackPush(obj->p1, StackPop(obj->p2));}return val;
}

        我们先把 栈1 的元素压入 栈2 中去,即StackPush(obj->p2, StackPop(obj->p1)); 条件是 栈1 不为空,当条件不满足则说明 栈1 中元素已经全部拷贝到 栈2 中去,接着让 栈2 出栈,记录出栈的数值,然后再把 栈2 拷贝回 栈1 。这一流程就是刚才的图的流程。

然后是查看队头数值函数 Peek(不移除元素,仅查看):

int myQueuePeek(MyQueue* obj) {while (!is_empty(obj->p1)) {StackPush(obj->p2, StackPop(obj->p1));}int val = StackPeek(obj->p2);while (!is_empty(obj->p2)) {StackPush(obj->p1, StackPop(obj->p2));}return val;
}

        逻辑和出队列函数一样,只不过val赋值时使用的是StackPeek函数,也就是只查看不删除的"出栈"函数。

最后是判断队列是否为空的函数:

bool myQueueEmpty(MyQueue* obj) {if (is_empty(obj->p1)) {return true;}else {return false;}
}

        直接根据 栈1 是否为空来判断队列是否为空即可,因为我们每次都会拷贝回 栈1 保证 栈1 是队列的真实元素。

最后补充一下销毁函数:

void myQueueFree(MyQueue* obj) {StackDes(obj->p1);StackDes(obj->p2);free(obj);obj = NULL;
}
void StackDes(struct Stacklist* stack) {free(stack->val);stack->val = NULL;
}

        这里我我同样使用了外部函数,可以整合一下。

这就是文章的全部内容了,希望对你有所帮助,如有错误欢迎评论。

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

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

相关文章

salesforce 如何访问lwc组件

访问lwc有哪些途径呢? Action ButtonTabAura use lwc(拓展)如何区分是新建页面还是编辑页面 Action Button xml文件中要配置tab<?xml version"1.0" encoding"UTF-8"?> <LightningComponentBundle xmlns"http://soap.sforce.com/2006/04/…

全景剖析阿里云容器网络数据链路(七):Terway DataPath V2(Terway≥1.8.0)

作者&#xff1a;余凯 前言 近几年&#xff0c;企业基础设施云原生化的趋势越来越强烈&#xff0c;从最开始的IaaS化到现在的微服务化&#xff0c;客户的颗粒度精细化和可观测性的需求更加强烈。容器网络为了满足客户更高性能和更高的密度&#xff0c;也一直在高速的发展和演…

Docker 简单使用及安装常用软件

一、Docker 安装、配置与卸载 1.1、Docker 安装 # 1.安装gcc环境 yum -y install gcc gcc-c && \# 2. 卸载docker旧版本&#xff08;可能之前有安装&#xff09; yum -y remove docker docker-common docker-selinux docker-engine && \# 3. 安装依赖的软件包…

PHP源码_最新在线工具箱网站系统源码

项目运行截图 源码贡献 https://githubs.xyz/boot?app41 部分数据库表 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for toolbox_category -- ---------------------------- DROP TABLE IF EXISTS toolbox_category…

Golang | Leetcode Golang题解之第64题最小路径和

题目&#xff1a; 题解&#xff1a; func minPathSum(grid [][]int) int {if len(grid) 0 || len(grid[0]) 0 {return 0}rows, columns : len(grid), len(grid[0])dp : make([][]int, rows)for i : 0; i < len(dp); i {dp[i] make([]int, columns)}dp[0][0] grid[0][0]…

ubuntu sudo apt-get install neo4j 配置安装与设置远程访问

文章目录 下载Adding the Debian repositoryInstalling Neo4j安装流程设置远程访问 下载 neo4j 官方的下载地址&#xff0c;进入页面之后&#xff0c;往下滑&#xff1a; https://neo4j.com/deployment-center/#community 点击 Visit https://debian.neo4j.com/ Adding the …

Apache Seata基于改良版雪花算法的分布式UUID生成器分析1

title: Seata基于改良版雪花算法的分布式UUID生成器分析 author: selfishlover keywords: [Seata, snowflake, UUID] date: 2021/05/08 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Seata基于改良版雪花算法的分布式UUID生成器分析…

电子式汽车机油压力传感器的接线方法及特点

电子式机油压力传感器由厚膜压力传感器芯片、信号处理电路、外壳、固定电路板装置和两根引线&#xff08;信号线和报警线&#xff09;组成。信号处理电路由电源电路、传感器补偿电路、调零电路、电压放大电路、电流放大电路、滤波电路和报警电路组成。 厚膜压力传感器是20世纪…

数据结构 - C/C++

快速跳转 数组链表栈队列串树 目录 数据结构 逻辑结构 物理结构 数据结构 数据 数据不仅仅包括整型、实型等数值类型&#xff0c;还包括字符及声音、图像、视频等非数值类型。 计算机可以理解并按照指定格式处理。 结构 元素相互之间存在一种或多种特定关系的数据集合。 …

tuxera ntfs for mac是什么 tuxera ntfs for mac怎么用 tuxera激活码

Tuxera NTFS for Mac是一款完全的mac读写软件&#xff0c;可辅助mac电脑读写ntfs格式&#xff0c;进行磁盘的管理。本文会详细讲解tuxera ntfs for mac的操作方法。 Tuxera NTFS for Mac 2023安装包免费下载&#xff1a;https://souurl.cn/IE35lO 一、Tuxera NTFS for Mac是什…

goget配置多个golang 运行环境

一台主机安装多个golang 运行环境 本环境 windows10 为 基础 mac linux也可以按照此方法操作 背景 开发不同的运维工具会用到不同版本的golang&#xff0c;但是开发者不能一直进行重装来处理 &#xff0c;因此 需要一个工具进行golang版本的管理 go管理工具介绍 gvm (Go V…

微服务保护和分布式事务(Sentinel、Seata)笔记

一、雪崩问题的解决的服务保护技术了解 二、Sentinel 2.1Sentinel入门 1.Sentinel的安装 &#xff08;1&#xff09;下载Sentinel的tar安装包先 &#xff08;2&#xff09;将jar包放在任意非中文、不包含特殊字符的目录下&#xff0c;重命名为 sentinel-dashboard.jar &…

【C++报错】error C2143:语法错误:缺少“ : ”(在“<” 的前面)[ 相互引用问题 ]

这里写自定义目录标题 情景再现问题分析是经典的互相引用问题 解决方案 情景再现 问题分析 template<class K,class T,class KeyofT,class Hash>class __HTIterator{typedef HashNode<T> Node;typedef HashTable<K, T, KeyofT, Hash> HT; 【★】typedef …

基于springboot+vue+Mysql的网上商城购物系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

Java创建并遍历N叉树(前序遍历)

力扣 title589&#xff1a;N叉树的前序遍历 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔&#xff08;请参见示例&#xff09;。 思路&#xff1a; 1.初始化时…

[ACTF2020 新生赛]BackupFile 1 [极客大挑战 2019]BuyFlag 1 [护网杯 2018]easy_tornado 1

目录 [ACTF2020 新生赛]BackupFile 1 1.打开页面&#xff0c;叫我们去找源文件 2.想到用disearch扫描&#xff0c;发现源文件index.php.bak 3.访问这个文件&#xff0c;下载一个文件&#xff0c;用记事本打开 4.翻译php代码 5.构造payload url/?key123&#xff0c;得到fl…

如何配置和使用Apollo的component里的plugin

关于如何使用Apollo的Component里的plugin&#xff0c;在Apollo的文档里只有如果和开发的说明却没有找到一个清楚完整说明怎么把plugin跑起来的说明&#xff0c;例如我想把lidar_detection_filter按我们的需求对目标过滤算法作修改然后编译完后&#xff0c;执行 cyber_launch …

【七十三】【算法分析与设计】516. 最长回文子序列,二叉树,329. 矩阵中的最长递增路径,记忆化递归填表

516. 最长回文子序列 给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 示例 1&#xff1a; 输入&#xff1a;s &qu…

《QT实用小工具·五十一》带动画的 CheckBox

1、概述 源码放在文章末尾 该项目实现了带动画效果的多选框&#xff0c;鼠标放在上面或者选中都会呈现炫酷的动画效果&#xff0c;demo演示如下&#xff1a; 项目部分代码如下所示&#xff1a; #ifndef LINEARCHECKBOX_H #define LINEARCHECKBOX_H#include <QCheckBox> …

OPPO手机支持深度测试+免深度测试解锁BL+ROOT权限机型整理-2024年3月更新

绿厂OPPO手机线上线下卖的都很不错&#xff0c;目前市场份额十分巨大&#xff0c;用户自然也非常多&#xff0c;而近期ROM乐园后台受到很多关于OPPO手机的私信&#xff0c;咨询哪些机型支持解锁BL&#xff0c;ROOT刷机&#xff0c;今天ROM乐园正式盘点当前市场上可以解BL刷root…