Leetcode经典题目之用队列实现栈

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。
P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。

  

目录

  • 1、题目展示
  • 2、题目分析
  • 3、完整代码演示
  • 4、结语

1、题目展示

在这里插入图片描述


  前面我们了解过如何实现队列的代码,如果有遗忘或不熟悉可以回看:链接: 队列的实现(使用链表)


  下面我们直接进入正文。



2、题目分析


  在我们的知识储备当中,我们知道,队列是一种先进先出的数据结构,而栈与其相反,是一种后进先出的数据结构,故我们在用队列实现栈的时候,可以使用两个队列来进行操作,从而令其达到栈的功能。

在这里插入图片描述

  对于此我们该如何进行理解,当我们需要向队列中插入数据时十分方便,我们可以任选其中一个进行插入,以q1为例,进行四次数据插入,分别为1,2,3,4。
在这里插入图片描述
  而出数据时,因为队列时先进先出,而我们要实现的功能时将最后一个插入的数据4删除或输出,故此时我们可以将1,2,3以队列出数据的形式输出到q2当中,并将q1当中的1,2,3删除,此时q1中只剩下了数据4,此时便可以将数据输出或直接删除了。
在这里插入图片描述
  当我们需要再次输入输出数据的时候便可以仿照上述模式进行操作,只不过输入时的队列选择不再是q1,而是有数据的那一个队列,当需要输出或删除数据时直接将有数据的队列中不需要操作的数据导入到没有数据的队列当中。这便是插入数据和删除输出数据。


  而题目中我们还需要实现的功能有判断栈是否为空。这一功能便十分简单,之间判断一下两个队列是否都为空即可。代码如下:

bool myStackEmpty(MyStack* obj) 
{
    return QueueEmpty(&(obj->q1)) && QueueEmpty(&(obj->q2));
}




3、完整代码演示


  我们在完成这一道题目时,因为是oj题目,所以在需要完成的功能函数前需要自行书写队列的相关内容代码,故不在此展示,有需要者可在标题1中自行寻找link链接。
typedef int QDataType;

typedef struct QueueNode
{
	struct QueueNode* next;
	QDataType val;
}QNode, * pQNode;


typedef struct Queue
{
	pQNode phead;
	pQNode ptail;
	int size;
}Queue, * pQueue;


//队列初始化
void QueueInit(pQueue pq)
{
	assert(pq);
	pq->phead = NULL;
	pq->ptail = NULL;
	pq->size = 0;
}

//队列销毁
void QueueDestroy(pQueue pq)
{
	assert(pq);
	pQNode cur = pq->phead;
	while (cur)
	{
		pQNode next = cur->next;
		free(cur);
		cur = next;
	}
	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}

void QueuePush(pQueue pq, QDataType x)
{
	assert(pq);
	pQNode tmp = (pQNode)malloc(sizeof(QNode));
	if (tmp == NULL)
	{
		perror("QueuePush:malloc");
		return;
	}
	tmp->next = NULL;
	tmp->val = x;
	if (pq->ptail == NULL)
	{
		pq->phead = pq->ptail = tmp;
	}
	else
	{
		pq->ptail->next = tmp;
		pq->ptail = tmp;
	}
	pq->size++;
}

void QueuePop(pQueue pq)
{
	assert(pq);
	assert(pq->size != 0);
	if (pq->phead == pq->ptail)
	{
		free(pq->phead);
		pq->phead = pq->ptail = NULL;
	}
	else
	{
		pQNode tmp = pq->phead->next;
		free(pq->phead);
		pq->phead = tmp;
	}
	pq->size--;
}

bool QueueEmpty(pQueue pq)
{
	assert(pq);
	return pq->size == 0;
}

QDataType QueueBack(pQueue pq)
{
	assert(pq);
	assert(pq->size != 0);
	return pq->ptail->val;
}

//取队列头数据
QDataType QueueFront(pQueue pq)
{
	assert(pq);
	assert(pq->size != 0);
	return pq->phead->val;
}

//队列数据个数
int QueueSize(pQueue pq)
{
	assert(pq);
	return pq->size;
}

typedef struct 
{
    Queue q1;
    Queue q2;
} MyStack;


MyStack* myStackCreate() 
{
    MyStack* obj = (MyStack*)malloc(sizeof(MyStack));
    QueueInit(&(obj->q1));
    QueueInit(&(obj->q2));
    return obj;
}

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(&(obj->q2)))
    {
        empty = &(obj->q2);
        nonempty = &(obj->q1);
    }
    while(QueueSize(nonempty) > 1)
    {
        QueuePush(empty,QueueFront(nonempty));
        QueuePop(nonempty);
    }
    int tmp = QueueFront(nonempty);
    QueuePop(nonempty);
    return tmp;
}

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);    
}




4、结语


  十分感谢您观看我的原创文章。
  本文主要用于个人学习和知识分享,学习路漫漫,如有错误,感谢指正。
  如需引用,注明地址。
;

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

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

相关文章

使用 Flask Blueprint 实现模块化 Web 应用

文章目录 1. 什么是 Flask Blueprint?2. 为什么要使用 Flask Blueprint?3. 如何使用 Flask Blueprint?4. 在 Blueprint 之间进行通信5. 结合 Flask 插件系统进行功能拓展结语 当构建大型 Flask Web 应用时,保持代码的组织结构清晰…

深度缓冲技术在AI去衣中的神奇作用

引言: 随着人工智能技术的飞速发展,其在图形处理和视觉领域的应用日益增多。AI去衣技术便是其中一个颇具争议但又技术上引人入胜的话题。今天,我们将深入探讨一项关键技术——深度缓冲(Depth Buffering),它…

Ubuntu 24 换国内源及原理 (阿里源 清华源 中科大源 网易源)

备份原文件 sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak 编辑源文件 sudo gedit /etc/apt/sources.list.d/ubuntu.sources 粘贴到文本(其中一个即可): (阿里源&#xff09…

HTML静态网页成品作业(HTML+CSS+JS)——华为商城网页(1个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,使用Javacsript代码实现首页图片切换轮播效果,共有1个页面…

SQL-递归查询

运行环境: Mysql8以上,递归查询功能在8以上版本被正式引入 一、SQL递归查询的概念 递归指的是通过调用函数或过程或自身来解决问题的方法,常用于一些具有规律性循环的操作。SQL递归查询是基于一组初始数据,通过递归查询&#xf…

Tableau学习2.0版——复习

官网下载链接:https://www.tableau.com/zh-cn/support/releases 学生账户申请链接:https://www.tableau.com/zh-cn/academic/students。直接去学信网下载学籍在线验证作为申请证明。 目录 1、可视化原理 2、基础图表制作 2.1 对比分析(比…

【持续更新中,图像分割数据集】字节发布 COCONut 入选 CVPR 2024,立即体验 Segment Anything 分割万物!|持续更新中!

随着计算机视觉技术的不断发展,图像分割在诸多领域展现出重要的应用价值。近年来,各种图像分割数据集如雨后春笋般涌现。上个月,字节跳动发布了首个大规模全景图像分割数据集「COCONut」,为这一领域的研究注入了新鲜血液。 HyperA…

【网络编程】Servlet的前后端练习 | 表白墙 | 前后端交互 | 提交消息 | 获取消息

文章目录 一、Servlet的前后端练习1.表白墙服务器要实现的逻辑:1.获取消息 :2.提交消息:完整前端代码:完整后端代码: 一、Servlet的前后端练习 1.表白墙 服务器要实现的逻辑: 1.页面加载时,网…

OBS直播二次开发_OBS直播软件介绍

OBS工作室版 免费且开源的用于视频录制以及直播串流的软件。 下载以在Windows, Mac以及Linux上简单且快速的开始串流。 功能 实时高性能的视频/音频捕捉与混合,以及无限的场景模式使您可以通过自定义实现无缝转换。为视频源设计的滤镜例如图片蒙版,色彩校正,色度/色彩键控…

java中的变量、数据类型、人机交互

变量 变量要素 1、类型;每一个变量都需要定义类型(强类型)其它语言有弱类型(js) 2、变量名; 3、存储的值; 声明方式: 数据类型 变量名 变量值; public static vo…

UDP怎么端口映射?

在网络通信中,TCP和UDP是两种常用的传输协议。UDP(User Datagram Protocol)是一种无连接的传输协议,相较于TCP协议来说,它更为轻量级且不可靠。UDP协议在某些场景下仍然有其独特的优势,尤其是在需要快速传输…

如何训练一个大模型:LoRA篇

目录 写在前面 一、LoRA算法原理 1.设计思想 2.具体实现 二、peft库 三、完整的训练代码 四、总结 写在前面 现在有很多开源的大模型,他们一般都是通用的,这就意味着这些开源大模型在特定任务上可能力不从心。为了适应我们的下游任务,…

用python写算法——队列笔记

1.队列定义 队列是一种特殊的线性表,它只允许在表的前端进行删除操作,在表的后端进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时&#…

C控制语句:分支和跳转

1.1if语句 //colddays.c --找出0摄氏度以下的天数占总天数的百分比 #include <stdio.h>int main(void) {const int FREEZING 0;float temperature;int cold_days 0;int all_days 0;printf("Enter the list of daily low temperature.\n");printf("Use…

Kexp 动态展示 k8s 资源对象依赖关系

kexp[1] 旨在以可视化的方式帮助用户理解和探索 Kubernetes 的能力。 适用场景&#xff1a; 学习和探索 Kubernetes 的功能。 应用开发&#xff0c;提供每个应用的对象图预设。 控制器和操作器的开发&#xff0c;支持动态对象图。 即将推出类似 Postman 的 Kubernetes API …

程序猿成长之路之数据挖掘篇——距离公式介绍

上一篇介绍了朴素贝叶斯&#xff0c;那么这次讲讲距离公式 什么是距离公式 用自己的话来说距离公式就是判断两个属性&#xff08;参数&#xff09;相似度的度量公式,比如以两点间距离为例&#xff0c;A地经纬度为(110.9802,120.9932)&#xff0c;B地经纬度为(110.9980,120.828…

Java | Leetcode Java题解之第86题分隔链表

题目&#xff1a; 题解&#xff1a; class Solution {public ListNode partition(ListNode head, int x) {ListNode small new ListNode(0);ListNode smallHead small;ListNode large new ListNode(0);ListNode largeHead large;while (head ! null) {if (head.val < x…

PyQt5中的LineEdit单行文本框

文章目录 1. 简介1.1 常用方法&#xff1a;1.2 常用信号&#xff1a; 2. LineEdit常用方法使用案例3. LineEdit常用信号使用案例 1. 简介 在PyQt5中&#xff0c;LineEdit&#xff08;单行文本框&#xff09;是一个常用的组件&#xff0c;它允许用户输入文本。以下是一些LineEd…

【游戏引擎】unity

目录 Unity入门教程&#xff1a;从零到英雄的旅程前言第一步&#xff1a;下载和安装Unity第二步&#xff1a;创建你的第一个Unity项目第三步&#xff1a;熟悉Unity界面第四步&#xff1a;创建一个简单的游戏对象第五步&#xff1a;编写脚本赋予游戏对象生命第六步&#xff1a;运…

华为OD机试【统一限载货物数最小值】(java)(200分)

1、题目描述 火车站附近的货物中转站负责将到站货物运往仓库&#xff0c;小明在中转站负责调度 2K 辆中转车(K辆干货中转车&#xff0c;K 辆湿货中转车)货物由不同供货商从各地发来&#xff0c;各地的货物是依次进站&#xff0c;然后小明按照卸货顺序依次装货到中转车&#xf…