leetcode 255.用队列实现栈

255.用队列实现栈

不出意外大概率这几天都会更新 leetcode,如果没有做新的题,大概就会把 leetcode 之前写过的题整理(单链表的题目居多一点)出来写成博客

今天讲的题蛮容易出错的(注意传参啊,最好把队列的实现写过一遍,写起来就容易一点)


题目

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。

实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

题目链接

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

文字 和 画图 分析

  1. 首先思考一下 栈 和 队列 两者之间 的区别:

栈:先进后出(用数组实现) 队列:先进先出(用链表实现)

栈:

队列:

      2. 最大的问题就是 出元素

   

明显一个队列我们不好模拟出栈,这里我们就要借助 两个队列去实现

栈是出 存进去的最后一个元素,而队列是出 存进去的第 一 个元素,要想两者对等,即第一个元素也就是最后 一个元素

我们把存放所有元素的那一个队列,除了最后一个元素, 其它的元素都移到没有存放元素的那一个队列,这样就做 到第一个元素也就是最后一个元素

      3. 存入元素

这里我们需要确保其中一个队列始终为空(有利于后面的 出元素),另一个队列专门存入元素,由于后续的出元素 导致我们无法确保哪一个队列存元素,哪一个队列为空 (如果 q1存元素,进行一次出元素之后,它就为空了 ),

这里我们用了一个方法:再定义两个指针 nonEmpty 和 Empty,用来存放 两个队列 的地址,开始nonEmpty存放 q1的地址,Empty存放q2的地址,判断 q1是否为空,如 果为空,nonEmpty存放q2的地址,Empty存放q1的地址

(也可以用 if ,else语句直接判断)


代码

typedef int QLType;
typedef struct QueueNode
{
    QLType val;
    struct QueueNode* next;
}QN;//创建节点
typedef struct QueueList
{
    QN* head;
    QN* tail;
    int size;
}QL;//创建队列
void QNInit(QL* pphead)
{
     pphead->head = pphead->tail = NULL;
     pphead->size = 0;
}//队列初始化
QLType QLTop(QL* pphead)
{
    return pphead->head->val;
}//返回列队的头节点元素
QLType QLtail(QL* pphead)
{
    return pphead->tail->val;
}//返回列队的尾节点元素
int  QLSize(QL* pphead)
{
    return pphead->size;
}//返回队列里面有效元素个数
bool QLEmpty(QL* pphead)
{
    return pphead->head == NULL;
}//判断队列是否为空
void QNPop(QL* pphead)
{
    QN* cur = pphead->head;
    pphead->head = pphead->head->next;
    free(cur);
    pphead->size--;
}//出队列存储的第一个元素
void QNPush(QL* pphead, QLType x)
{
    QN* newnode = (QN*)malloc(sizeof(QN));
    newnode->next = NULL;
    newnode->val = x;
    if (newnode == NULL)
    {
        perror("malloc");
        return;
    }
    if (QLEmpty(pphead))
    {
        pphead->head = pphead->tail = newnode;
    }
    else
    {
        pphead->tail->next = newnode;
        pphead->tail = newnode;
    }
    pphead->size++;
}//存入队列元素

//以上都是服务队列的创建

typedef struct 
{
    QL q1;
    QL q2;
}MyStack//存放两个队列

MyStack* myStackCreate() 
{
    MyStack* obj = (MyStack*)malloc(sizeof(MyStack));
    QNInit(&obj->q1);
    QNInit(&obj->q2);
    return obj;
} //两个队列的初始化

void myStackPush(MyStack* obj, int x) 
{
    if(!QLEmpty(&obj->q1))
    {
       QNPush(&obj->q1,  x);
    }
    else
    {
       QNPush(&obj->q2,  x);
    }
}//存放元素

int myStackPop(MyStack* obj)
{
    QL *nonEmpty = &obj->q1;
    QL *Empty = &obj->q2;
    if(QLEmpty(&obj->q1))
    {
        nonEmpty = &obj->q2;
        Empty = &obj->q1;
    }
    while(QLSize(nonEmpty) > 1)
    {
       QNPush(Empty, QLTop(nonEmpty));
       QNPop(nonEmpty);
    }
    int top = QLTop(nonEmpty);
    QNPop(nonEmpty);
    return top;
}//出元素

int myStackTop(MyStack* obj) 
{
    if(!QLEmpty(&obj->q1))
    {
       return QLtail(&obj->q1);
    }
    else
    {
       return QLtail(&obj->q2);
    }
}//返回栈顶元素

bool myStackEmpty(MyStack* obj) 
{
    return  QLEmpty(&obj->q1) && QLEmpty(&obj->q2);
}//判断两个栈是否都为空

void myStackFree(MyStack* obj) 
{
    free(obj);
}//销毁空间

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java简易版 TCP协议一对一聊天

客户端 package 二十一章;import java.io.*; import java.net.Socket; import java.util.Date; import javax.swing.*;public class Server {private JFrame jf;private JButton jBsend;private JTextArea jTAcontent;private JTextField jText;private JLabel JLcontent;priv…

冒泡排序和直接选择排序(C/C++实现)

文章目录 冒泡排序(交换排序)基本思想特性总结代码实现 直接选择排序基本思想特性总结代码实现(优化,每次循环同时选择最小和最大的数) 冒泡排序(交换排序) 基本思想 基本思想:所谓交换,就是根…

【数据结构】循环队列

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 🎏队列顺序存储的不足 🎏循环队列的定义 🎏设计循环队列 结语 🎏队列顺序存储的不足 我们假设用一个可以存放为n个数据…

人工智能AIGC培训讲师叶梓介绍及AI强化学习培训提纲

叶梓,上海交通大学计算机专业博士毕业,高级工程师。主研方向:数据挖掘、机器学习、人工智能。历任国内知名上市IT企业的AI技术总监、资深技术专家,市级行业大数据平台技术负责人。个人主页:大数据人工智能AI培训讲师叶…

栈和队列的互相实现

用队列实现栈 OJ链接 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 实现 MyStack 类: void push(int x) 将元素 x 压入栈顶。int pop() 移除并返…

Qexo博客后台管理部署

Qexo博客后台管理部署 个人主页 个人博客 参考文档 https://www.oplog.cn/qexo/本地部署 采用本地Docker部署管理本地Hexo 下载代码包 若无法下载使用科学工具下载到本地在上传到服务器 wget https://github.com/Qexo/Qexo/archive/refs/tags/3.0.1.zip# 解压 unzip Qexo…

Python 中检查一个数是不是另一个数的整数次幂

更多资料获取 📚 个人网站:ipengtao.com 在数学和计算中,确定一个数是否为另一个数的整数次幂是一个常见而重要的问题。例如,我们可能需要判断一个数是否是某个数的平方、立方或其他幂次。本文将探讨在Python中如何实现这一功能&…

算数运算符和算数表达式

基本算数运算符 算数运算符: (加法运算符或正值运算符)、-(减法运算符或负值运算符)、*(乘)、/(除)、%(求余数) 双目运算符: 双目…

【QED】小樱的问题

目录 题目描述输入格式输出格式 测试样例样例说明 思路核心代码 题目描述 在 f u f u fufu fufu乐园,每天都会有各种各样精彩的内容发生。就比如说,今天,小樱的米饭店开张啦! 为了吸引 f u f u fufu fufu们前来购买小樱的大米&a…

唱响主旋律——建行江门市分行推动服务实体经济高质量发展

建行江门市分行主动对接当地战略部署,在侨乡热土踏歌而行,全力当好服务实体经济的主力军和维护金融稳定的压舱石,在助力再造一个现代化新江门上贡献建行力量。 输血实体 为实体经济服务是金融的天职。建行江门市分行积极发挥在重大基建领域…

异步回调模式

异步回调 所谓异步回调,本质上就是多线程中线程的通信,如今很多业务系统中,某个业务或者功能调用多个外部接口,通常这种调用就是异步的调用。如何得到这些异步调用的结果自然也就很重要了。 Callable、Future、FutureTask publi…

C/C++之输入输出

文章目录 一.C语言的输入输出1.printfi. 输出整数ii. 浮点数iii.字符 & 字符串 2.scanfi.整数ii.浮点数iii. 字符 & 字符串 3.特殊用法i. * 的应用ii. %n 的应用iii. %[] 的应用 二.C中的输入输出1.couti. 缓冲区(buffer)ii. cout之格式化输出 2…

python爬虫学习-批量爬取图片

python爬虫学习-批量爬取图片 爬虫步骤爬取前十页图片到本地根据页码获取网络源码使用xpath解析网页解析网页并下载图片主函数如下 爬取的网站为站长素材(仅做学习使用) 爬取的目标网站为 https://sc.chinaz.com/tupian/qinglvtupian.html如果爬取多页&…

有什么进销存软件能对接微信小程序?

有什么进销存软件能对接微信小程序? 据我所知,很多进销存软件都有配套的微信小程序吧。 以我们现在用的这个为例,这也是同行推荐过来的,很好用,而且性价比很高—— 在线平台,无需下载APP,搭载…

Python Cupy 模块:加速大规模数值计算

更多资料获取 📚 个人网站:ipengtao.com Cupy是一个基于NumPy的库,专门设计用于在GPU上进行高性能计算。它提供了与NumPy相似的API,因此用户可以很容易地将现有的NumPy代码迁移到Cupy上,从而充分利用GPU的并行计算能力…

Java数据结构06——树

1.why: 数组&链表&树 2. 大纲 2.1前中后序 public class HeroNode {private int no;private String name;private HeroNode left;//默认为nullprivate HeroNode right;//默认为nullpublic HeroNode(int no, String name) {this.no no;this.name name;}public int …

基于Python的前程无忧、51job、智联招聘等招聘网站数据获取及数据分析可视化大全【代码+演示】

需要本项目的可以私信博主,获取,或者文末卡片获取 import pandas as pd import glob import warnings warnings.filterwarnings("ignore")# 指定目录 directory ./data/# 使用glob来获取所有.xlsx文件 excel_files glob.glob(directory *.x…

软件科技成果鉴定测试需提供哪些材料?

为了有效评估科技成果的质量,促进科技理论向实际应用转化,所以需要进行科技成果鉴定测试。申请鉴定的科技成果范围是指列入国家和省、自治区、直辖市以及国务院有关部门科技计划内的应用技术成果,以及少数科技计划外的重大应用技术成果。   …

高项备考葵花宝典-项目进度管理输入、输出、工具和技术(下,很详细考试必过)

项目进度管理的目标是使项目按时完成。有效的进度管理是项目管理成功的关键之一,进度问题在项目生命周期内引起的冲突最多。 小型项目中,定义活动、排列活动顺序、估算活动持续时间及制定进度模型形成进度计划等过程的联系非常密切,可以视为一…

Bash脚本处理ogg、flac格式到mp3格式的批量转换

现在下载的许多音乐文件是flac和ogg格式的,QQ音乐上下载的就是这样的,这些文件尺寸比较大,在某些场合使用不便,比如在车机上播放还是mp3格式合适,音质这些在车机上播放足够了,要求不高。比如本人就喜欢下载…