[Leetcode]用栈实现队列

用栈实现队列:

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false

1.题解:

通过两个栈的配合实现队列的基本功能,下面先实现栈的基本功能

栈: (前面文章介绍过栈的实现,这里就不过多阐述)

typedef int StackDataType;
typedef struct Stack {StackDataType* head;int capacity;int size;
}Stack;
//创建栈
Stack* StackCreate() {Stack* tmp = (Stack*)malloc(sizeof(Stack));tmp->head = NULL;tmp->capacity = tmp->size = 0;return tmp;
}
//入栈
void StackPush(Stack*tmp,StackDataType x) {if (tmp->capacity == tmp->size) {int newcapacity = tmp->capacity == 0 ? 4 : 2 * tmp->capacity;StackDataType* cur = (StackDataType*)realloc(tmp->head, newcapacity * sizeof(StackDataType));if (cur == NULL) {perror("StackPush:malloc");exit;}tmp->head = cur;tmp->capacity = newcapacity;}tmp->head[tmp->size] = x;tmp->size++;
}
//出栈
StackDataType StackPop(Stack*tmp) {if (tmp->size == 0) {perror("StackPop:NULL");exit;}StackDataType s = tmp->head[tmp->size - 1];tmp->size--;return s;
}
//栈的销毁
void StackDestroy(Stack*tmp) {free(tmp->head);tmp->head = NULL;tmp->capacity = tmp->size = 0;free(tmp);tmp = NULL;
}

2.基于栈实现队列基本功能:

入队列:

根据上图思路,一个栈(stack1)存储数据,一个栈(stack2)出数据。

void myQueuePush(MyQueue* obj, int x) {assert(obj);StackPush(obj->stack1, x);
}
出队列:

出队列就涉及到判断出数据的那个栈(stack2)是否有数据(栈判空(StackEmpty))

int myQueuePop(MyQueue* obj) {assert(obj);if (obj->stack2->size == 0) {while (obj->stack1->size != 0) {StackPush(obj->stack2, StackPop(obj->stack1));}}return StackPop(obj->stack2);
}
返回队列顶部元素:

同样涉及判空问题,因为该功能仅和出队列少了最后删除元素

int myQueuePeek(MyQueue* obj) {assert(obj);if (obj->stack2->size == 0) {if (obj->stack1->size == 0) {perror("Peek:NULL");exit;}return obj->stack1->head[0];}return obj->stack2->head[obj->stack2->size - 1];
}
 判空:

stack1与stack2均为空

bool myQueueEmpty(MyQueue* obj) {assert(obj);return obj->stack1->size == 0 && obj->stack2->size == 0;
}

 3.完整代码:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef int StackDataType;
typedef struct Stack {StackDataType* head;int capacity;int size;
}Stack;
Stack* StackCreate() {Stack* tmp = (Stack*)malloc(sizeof(Stack));tmp->head = NULL;tmp->capacity = tmp->size = 0;return tmp;
}
void StackPush(Stack*tmp,StackDataType x) {if (tmp->capacity == tmp->size) {int newcapacity = tmp->capacity == 0 ? 4 : 2 * tmp->capacity;StackDataType* cur = (StackDataType*)realloc(tmp->head, newcapacity * sizeof(StackDataType));if (cur == NULL) {perror("StackPush:malloc");exit;}tmp->head = cur;tmp->capacity = newcapacity;}tmp->head[tmp->size] = x;tmp->size++;
}
StackDataType StackPop(Stack*tmp) {if (tmp->size == 0) {perror("StackPop:NULL");exit;}StackDataType s = tmp->head[tmp->size - 1];tmp->size--;return s;
}
void StackDestroy(Stack*tmp) {free(tmp->head);tmp->head = NULL;tmp->capacity = tmp->size = 0;free(tmp);tmp = NULL;
}
typedef struct Queue{Stack* stack1;Stack* stack2;
}MyQueue;MyQueue* myQueueCreate() {MyQueue* queue = (MyQueue*)malloc(sizeof(MyQueue));queue->stack1 = StackCreate();queue->stack2 = StackCreate();return queue;
}void myQueuePush(MyQueue* obj, int x) {assert(obj);StackPush(obj->stack1, x);
}int myQueuePop(MyQueue* obj) {assert(obj);if (obj->stack2->size == 0) {while (obj->stack1->size != 0) {StackPush(obj->stack2, StackPop(obj->stack1));}}return StackPop(obj->stack2);
}int myQueuePeek(MyQueue* obj) {assert(obj);if (obj->stack2->size == 0) {if (obj->stack1->size == 0) {perror("Peek:NULL");exit;}return obj->stack1->head[0];}return obj->stack2->head[obj->stack2->size - 1];
}bool myQueueEmpty(MyQueue* obj) {assert(obj);return obj->stack1->size == 0 && obj->stack2->size == 0;
}

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

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

相关文章

硬件设备杂记——12G SDI及 AES67/EBU

常见的 SDI线缆规格&#xff0c;HD-SDI又被称为1.5G-SDI&#xff0c;具体参数以秋叶原的参数为例 AES67/EBU 目前音频网络标准主要集中在OSI网络体系的第二层和第三层。 第二层音频标准的弊端在于构建音频网络时需要专用的交换机&#xff0c;无法利用现有的以太网络&#xff0c…

apache是什么

​Apache(音译为阿帕奇)是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上&#xff0c;由于其跨平台和安全性被广泛使用&#xff0c;是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充&#xff0c;将Perl/Python等解释器编译…

Ubuntu22.04.4 - 网络配置 - 笔记

一、设置固定ip 1、cd /etc/netplan 查看文件夹下的配置文件 我这里叫 00-installer-config.yaml 2、sudo nano /etc/netplan/00-installer-config.yaml 完成配置后&#xff0c;按下Ctrl O保存更改&#xff0c;然后按下Ctrl X退出nano编辑器。 3、sudo netplan apply 4、ip …

OpenHarmony UI动画-rebound

简介 rebound是一个模拟弹簧动力学&#xff0c;用于驱动物理动画的库。 下载安装 ohpm install ohos/reboundOpenHarmony ohpm环境配置等更多内容&#xff0c;请参考如何安装OpenHarmony ohpm 使用说明 import rebound from ohos/rebound;功能一&#xff1a;创建维护弹簧对…

python将xml格式文件转成png或者pdf格式

本文主要介绍运行NCCL代码时输出的xml文件该如何转成更加容易观看的图格式 如下是举例&#xff0c;服务器上的PCIE相关的topo xml 文件 <system version"1"><cpu numaid"1" affinity"ffffff00,0000ffff,ff000000" arch"x86_64&q…

数字乡村创新实践推动农业现代化发展:科技赋能农业产业升级、提升农民收入水平与乡村治理效能

随着信息技术的迅猛发展和数字化转型的深入推进&#xff0c;数字乡村创新实践已成为推动农业现代化发展的重要引擎。数字技术的广泛应用不仅提升了农业生产的智能化水平&#xff0c;也带动了农民收入的增加和乡村治理的现代化。本文旨在探讨数字乡村创新实践如何科技赋能农业产…

Tomcat漏洞利用工具-TomcatVuln

检测漏洞清单 CVE-2017-12615 PUT文件上传漏洞 tomcat-pass-getshell 弱认证部署war包 弱口令爆破 CVE-2020-1938 Tomcat 文件读取/包含项目地址 https://github.com/errors11/TomcatVuln TomcatVuln put文件上传 ajp协议漏洞 默认读取web.xml文件&#xff0c;漏洞利用…

【C++】list的介绍及使用说明

目录 00.引言 01.list的介绍 模版类 独立节点存储 list的使用 1.构造函数 2.迭代器的使用 分类 运用 3.容量管理 empty()&#xff1a; size(): 4.元素访问 5.增删查改 00.引言 我们学习数据结构时&#xff0c;学过两个基本的数据结构&#xff1a;顺序表和链表。顺…

C/C++中程序内存区域划分

总结C/C中程序内存区域划分 C/C程序内存分配的几个区域&#xff1a; 1. 栈区&#xff08;stack&#xff09;&#xff1a;在执⾏函数时&#xff0c;函数内局部变量的存储单元都可以在栈上创建&#xff0c;函数执⾏结束时 这些存储单元⾃动被释放。栈内存分配运算内置于处理器的…

【观察】容器化部署“再简化”,云原生体验“再升级”

自2013年云原生概念被提出以来&#xff0c;云原生技术和架构在过去十多年得到了迅速的发展&#xff0c;并对数字基础设施、应用架构和应用构建模式带来了深刻的变革。根据IDC预测&#xff0c;到2024年&#xff0c;新增的生产级云原生应用在新应用的占比将从2020年的10%增加到60…

2021年全国大学生电子设计竞赛D题——基于互联网的摄像测量系统(二)

09 电路设计 前面介绍了系统的硬件框图如下&#xff1a; 硬件基本分为三块&#xff0c;两个摄像节点&#xff0c;一个终端节点。 1. 摄像节点硬件 摄像节点由一个DE10-Nano开发板和一个D8M摄像头实现&#xff0c;DE10-Nano开发板的HDMI接口外接HDMI显示器来显示拍摄到的视频。…

Objective-C网络数据捕获:使用MWFeedParser库下载Stack Overflow示例

概述 Objective-C开发中&#xff0c;网络数据捕获是一项常见而关键的任务&#xff0c;特别是在处理像RSS源这样的实时网络数据流时。MWFeedParser库作为一个优秀的解析工具&#xff0c;提供了简洁而强大的解决方案。本文将深入介绍如何利用MWFeedParser库&#xff0c;以高效、…