C语言每日一题(36)队列实现栈功能

力扣 225 用队列实现栈

题目描述

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

实现 MyStack 类:

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

思路分析

关于栈的功能,见于是基础的数据结构,且如果知道队列的功能也一定会知道栈的功能,这里不过多赘述,直接上思路

基于栈后进先出,而队列先进先出的特点,我们可以定义两个队列,

这里先描述出栈的实现,假设一个队列里已经放好了值,为1,2,3,4,按照队列出队的话,先取到1,但如果出栈的话,就需要取到4,这里另外一个队列就派上用场了,我们可以将队尾前的所有元素出队,并进入到另一个队列里,最后剩下的就是需要出栈的元素,此时我们在去原队列的队头元素即可。

接下来到入栈的实现,关键在于应该入哪个队,如果两队为空,随便一个,但接下来的话如果要方便上述出栈的实现,我们就需要入队到不为空的队列。

紧接着是返回栈顶元素,我们已经知道,队尾就是我们出栈的元素,所以这里直接返回队列的队尾元素即可。

判断栈为空,直接检测两个队列是否同时为空即可。

力扣不提供队列的实现代码,我们需要自己实现

完整代码

队列的实现代码

typedef int QueueDataType;typedef struct QuNode
{QueueDataType data;struct QuNode* next;
}QuNode;typedef struct Queue
{QuNode* phead;QuNode* ptail;int size;
}Queue;// 初始化队列
void QueueInit(Queue* q);
// 队尾入队列
void QueuePush(Queue* q, QueueDataType data);
// 队头出队列
void QueuePop(Queue* q);
// 获取队列头部元素
QueueDataType QueueFront(Queue* q);
// 获取队列队尾元素
QueueDataType QueueBack(Queue* q);
// 获取队列中有效元素个数
int QueueSize(Queue* q);
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0
int QueueEmpty(Queue* q);
//打印队列
void QueuePrint(Queue* q);
// 销毁队列
void QueueDestroy(Queue* q);// 初始化队列
void QueueInit(Queue* q)
{assert(q);q->phead = NULL;q->ptail = NULL;q->size = 0;
}
// 队尾入队列
void QueuePush(Queue* q, QueueDataType data)
{assert(q);//创建结点QuNode* newnode = (QuNode*)malloc(sizeof(QuNode));if (newnode == NULL){perror("malloc fail");return;}newnode->data = data;newnode->next = NULL;//插入if (q->ptail == NULL){q->phead = q->ptail = newnode;}else{q->ptail->next = newnode;q->ptail = newnode;}q->size++;
}// 队头出队列
void QueuePop(Queue* q)
{assert(q);assert(q->phead);QuNode* del = q->phead;q->phead = q->phead->next;free(del);del = NULL;if (q->phead == NULL){q->ptail = NULL;}q->size--;
}// 获取队列头部元素
QueueDataType QueueFront(Queue* q)
{assert(q);assert(q->phead);return q->phead->data;
}
// 获取队列队尾元素
QueueDataType QueueBack(Queue* q)
{assert(q);assert(q->ptail);return q->ptail->data;
}
// 获取队列中有效元素个数
int QueueSize(Queue* q)
{assert(q);return q->size;
}
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0
int QueueEmpty(Queue* q)
{assert(q);if (q->phead == NULL){return 1;}else{return 0;}
}// 销毁队列
void QueueDestroy(Queue* q)
{assert(q);QuNode* cur = q->phead;while (cur){QuNode* next = cur->next;free(cur);cur = next;}q->phead = q->ptail = NULL;q->size = 0;
}//打印队列
void QueuePrint(Queue* q)
{assert(q);QuNode* cur = q->phead;while (cur->next!=NULL){printf("%d ", cur->data);cur = cur->next;}
}

实现代码

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* pst, int x) {if(QueueEmpty(&pst->q1))//找出不为空的队列将元素入队{QueuePush(&pst->q2,x);}else{QueuePush(&pst->q1,x);}}int myStackPop(MyStack* pst) {Queue* empty=&pst->q1;//假设法,假设q1为空,后面再判断一下结果,不对再反过来Queue* noneempty=&pst->q2;if(QueueEmpty(&pst->q2)){empty=&pst->q2;noneempty=&pst->q1;}while(QueueSize(noneempty)>1)//将出栈元素前的所有元素出队,进入到空队列中{QueuePush(empty,QueueFront(noneempty));QueuePop(noneempty);}int top=QueueFront(noneempty);//取到出栈元素QueuePop(noneempty);return top;}int myStackTop(MyStack* pst) {if(QueueEmpty(&pst->q1))//返回不为空队列的队尾元素{return QueueBack(&pst->q2);}else{return QueueBack(&pst->q1);}}bool myStackEmpty(MyStack* obj) {return QueueEmpty(&obj->q1)&&QueueEmpty(&obj->q2);}void myStackFree(MyStack* obj) {QueueDestroy(&obj->q1);QueueDestroy(&obj->q2);free(obj);obj=NULL;}

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

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

相关文章

vue2系列 — 自定义指令

https://v2.cn.vuejs.org/v2/guide/custom-directive.html <div v-example:foo.bar"baz">vue 自定义指令的钩子 bind&#xff1a; 当 v-XXX 指令绑定到节点上时 触发inserted&#xff1a;被绑定元素插入父节点时调用update&#xff1a;所在组件的 VNode 更新…

使用nprogress实现请求进度条

一、安装nprogress npm i nprogress 二、 在axios的请求拦截器中使用nprogress 如果对于axios的请求和响应拦截器的使用不了解的&#xff0c;可以看这篇文章&#xff1a; axios二次封装配置请求拦截器和响应拦截器-CSDN博客 nprogress上有两个有用的方法&#xff1a; star(…

OpenStack云计算平台-Dashboard(图形化)

目录 一、安装和配置 1、安全并配置组件 2、完成安装 ​二、验证操作 一、安装和配置 1、安全并配置组件 安装软件包&#xff1a; yum install openstack-dashboard 编辑文件 vim /etc/openstack-dashboard/local_settings vim /etc/httpd/conf.d/openstack-dashboard.…

如何用Python爬取全国高校数据?

前言 Python是一门强大的编程语言&#xff0c;它可以用于爬取互联网上的各种数据。在这篇文章中&#xff0c;我们将学习如何使用Python爬取全国高校数据&#xff0c;并使用代理IP进行爬取。 本文主要分为以下几个部分&#xff1a; 数据来源及需求安装依赖包及导入模块爬取全…

关于禅道的安装配置以及项目管理、团队协同工作

目录 一、禅道是什么&#xff1f; 二、特点和功能 三、安装禅道 3.1 下载官网 3.2 版本考虑 3.3 禅道使用手册参考 3.4 Windows端安装禅道 四、启动禅道 4.1 访问禅道 四、禅道部分功能的使用 4.1 添加项目集 4.2 启动/关闭项目 4.3 项目计划仪表盘/阶段目标/研发…

头歌——操作系统实训总结

死锁 1、系统出现死锁时一定同时保持了四个必要条件&#xff0c;对资源采用按序分配算法后可破坏的条件是&#xff08;A&#xff09;。 A、循环等待条件B、互斥条件C、占有并等待条件D、不可抢占条件 2、资源的静态分配算法在解决死锁问题中是用于&#xff08;B&#xff09;。 …

【图论】关键路径求法c++

代码结构如下图&#xff1a; 其中topologicalSort(float**, int, int*, bool*, int, int)用来递归求解拓扑排序&#xff0c;topologicalSort(float**, int*&, int, int, int)传参图的邻接矩阵mat与结点个数n&#xff0c;与一个引用变量数组topo&#xff0c;返回一个布尔值…

代码随想录-刷题第五天

链表题目总结 链表基本操作 对链表进行增删改查等基本操作。注意&#xff0c;很多链表的题目使用虚拟头结点操作起来会更加方便。每次对应头结点的情况都要单独处理&#xff0c;所以使用虚拟头结点的技巧&#xff0c;就可以解决这个问题。 反转链表 可以使用头插法&#xf…

Shopee本土号封号几率大吗?如何避免封号?被封号了怎么办?

Shopee是近几年热门的电商平台之一&#xff0c;即使越来越多的跨境电商涌现&#xff0c;他的地位在东南亚市场依然占据一席之地&#xff0c;也依旧吸引着需要跨境商家入局。尤其在2023年&#xff0c;在TikTok Shop在印尼被关停之后&#xff0c;留下了大片空白&#xff0c;Shope…

CF 1890A Doremy‘s Paint 3 学习笔记 map的使用

原题 A. Doremys Paint 3 time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output An array &#x1d44f;1,&#x1d44f;2,…,&#x1d44f;&#x1d45b;&#xfffd;1,&#xfffd;2,…,&#xfffd;&a…

跨境电商必须要海外代理IP吗?盘点五大海外代理IP

相信跨境电商人近日都为了2023的跨境黑五旺季奋战&#xff0c;而2024也即将来临&#xff0c;对于跨境人的考验一波接着一波&#xff0c;根据Adobe Analytics的数据&#xff0c;2022年黑色星期五的销售额创下91.2亿美元新高&#xff0c;网络星期的销售额同样达到创纪录的113亿美…

『 C++类与对象 』多态之单继承与多继承的虚函数表

文章目录 &#x1fae7; 前言&#x1fae7; 查看虚表&#x1fae7; 单继承下的虚函数表&#x1fae7; 多继承下的虚函数表 &#x1fae7; 前言 多态是一种基于继承关系的语法,既然涉及到继承,而继承的方式有多种: 单继承多继承棱形继承棱形虚拟继承 不同的继承方式其虚表的形…

ToDesk提示通道限制 - 解决方案

问题 使用ToDesk进行远程控制时&#xff0c;免费个人账号最多支持1个设备同时发起远控&#xff0c;若使用此账号同时在2个设备发起远控&#xff0c;则会提示通道限制&#xff0c;如下图&#xff1a; 解决方案 方案1&#xff1a;断开其它远控 出现通道限制弹窗时&#xff0…

数据结构(超详细讲解!!)第二十四节 二叉树(下)

1.遍历二叉树 在二叉树的一些应用中&#xff0c;常常要求在树中查找具有某种特征的结点&#xff0c;或者对树中全部结点逐一进行某种处理。这就引入了遍历二叉树的问题&#xff0c;即如何按某条搜索路径访问树中的每一个结点&#xff0c;使得每一个结点仅且仅被访问一次。 …

python3实现tailf命令

由于windows上面没有类似linux上面的tailf命令&#xff0c;所以下面的python脚本来代替其能力。 tailf.py import re import timeimport os import argparsedef follow(thefile):thefile.seek(0, os.SEEK_END)while True:_line thefile.readline()if not _line:time.sleep(0…

RabbitMQ 搭建和工作模式

MQ基本概念 1. MQ概述 MQ全称 Message Queue&#xff08;[kjuː]&#xff09;&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。 &#xff08;队列是一种容器&#xff0c;用于存放数据的都是容器&#xff0…

docker部署微服务

目录 docker操作命令 镜像操作命令 拉取镜像 导出镜像 删除镜像 加载镜像 推送镜像 部署 pom文件加上 在每个模块根目录加上DockerFile文件 项目根目录加上docker-compose.yml文件 打包&#xff0c;clean&#xff0c;package 服务器上新建文件夹 测试docker-compo…

基于springboot和微信小程序的流浪动物管理系统

基于springboot和微信小程序的流浪动物管理系统 内容简介 基于微信小程序实现的流浪动物管理系统&#xff0c;该系统针对用户与管理员两种角色进行开发。 1、提供流浪动物的信息查询功能&#xff0c;包括品种、年龄、性别、健康状况等&#xff0c;提供救助活动报名功能。 2…

5.1 PBR基础 BRDF介绍

基于物理的渲染&#xff08;Physically Based Rendering&#xff0c;PBR&#xff09;是指使用基于物理原理和微平面理论建模的着色/光照模型&#xff0c;以及使用从现实中测量的表面参数来准确表示真实世界材质的渲染理念。 一、反射率方程 理论基础放在参考链接里。 直接开始…

【uniapp】uniapp开发小程序定制uni-collapse(折叠面板)

需求 最近在做小程序&#xff0c;有一个类似折叠面板的ui控件&#xff0c;效果大概是这样 代码 因为项目使用的是uniapp&#xff0c;所以打算去找uniapp的扩展组件&#xff0c;果然给我找到了这个叫uni-collapse的组件&#xff08;链接&#xff1a;uni-collapse&#xff09…