[Leetcode]用栈实现队列

news2024/11/24 17:20:36

用栈实现队列:

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(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.coloradmin.cn/o/1607516.html

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

相关文章

【智能算法】鸡群优化算法(CSO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2014年&#xff0c;X Meng等人受到鸡群社会行为启发&#xff0c;提出了鸡群优化算法&#xff08;Chicken Swarm Optimization, CSO&#xff09;。 2.算法原理 2.1算法思想 CSO算法的思想是基于对…

(六)PostgreSQL的组织结构(3)-默认角色和schema

PostgreSQL的组织结构(3)-默认角色和schema 基础信息 OS版本&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a;16.2 pg软件目录&#xff1a;/home/pg16/soft pg数据目录&#xff1a;/home/pg16/data 端口&#xff1a;57771 默认角色 Post…

软考135-上午题-【软件工程】-软件配置管理

备注&#xff1a; 该部分考题内容在教材中找不到。直接背题目 一、配置数据库 配置数据库可以分为以下三类&#xff1a; (1) 开发库 专供开发人员使用&#xff0c;其中的信息可能做频繁修改&#xff0c;对其控制相当宽松 (2) 受控库 在生存期某一阶段工作结束时发布的阶段产…

手机拍摄视频怎么做二维码?现场录制视频一键生成二维码

随着手机摄像头的像素不断提升&#xff0c;现在经常会通过手机的拍摄视频&#xff0c;然后发送给其他人查看。当我们想要将一个视频分享给多人去查看时&#xff0c;如果一个个去发送会比较的浪费时间&#xff0c;而且对方还需要下载接受视频后才可以查看&#xff0c;时间成本高…

简化PLC图纸绘制流程:利用SOLIDWORKS Electrical提升效率与准确性

效率一向是工程师比较注重的问题&#xff0c;为了提高工作效率&#xff0c;工程师绞尽脑汁。而在SOLIDWORKS Electrical绘制plc原理图时能有效提高PLC图纸的出图效率&#xff0c;并且可以减少数据误差。 在SOLIDWORKS Electrical绘制PLC图纸时&#xff0c;可以先创建PLC输入/输…

域名被污染了只能换域名吗?

域名污染是指域名的解析结果受到恶意干扰或篡改&#xff0c;使得用户在访问相关网站时出现异常。很多域名遭遇过污染的情况&#xff0c;但是并不知道是域名污染&#xff0c;具体来说&#xff0c;域名污染可能表现为以下情况&#xff1a;用户无法通过输入正确的域名访问到目标网…

24华中杯数学建模C题详解速通

本文针对光纤传感领域的曲线重构问题,提出了一套完整的数学建模与求解方法。通过对三个具体问题的分析和求解,揭示了曲率测量、曲线重构、误差分析等环节的内在联系和数学原理。本文综合运用了光纤传感、数值分析、微分几何等学科的知识,构建了波长-曲率转换模型、曲率连续化模…

Oracle——领先的企业级数据库解决方案

一、WHAT IS ORACLWE&#xff1a; ORACLE 数据库系统是美国 ORACLE 公司&#xff08;甲骨文&#xff09;提供的以分布式数据库为核心的一组软件产品&#xff0c;是目前最流行的客户/服务器(CLIENT/SERVER)或B/S 体系结构的数据库之一&#xff0c;ORACLE 通常应用于大型系统的数…

护眼台灯哪个牌子好?五大护眼效果好的护眼台灯强力推荐

护眼台灯哪个牌子好&#xff1f;护眼台灯比较好的牌子有书客、雷士、爱德华医生等&#xff0c;这些护眼台灯由于研发实力比较强&#xff0c;除了基本的照明功能&#xff0c;在护眼效果方面的表现也是比较不错的&#xff0c;这样的护眼台灯能够真正地起到对眼睛的保护作用&#…

读《AI营销画布》步骤五 保收获(十)

前言 正如书中所说&#xff0c;做到前四步就已经很了不起了&#xff0c;但是&#xff0c;现如今有很多公司的IT部门正从原来的公司分离&#xff0c;成立了不同的科技公司&#xff0c;以确保从费用成本中心变为利润中心&#xff0c;当然&#xff0c;分离出来不一定是AI促进的&am…

【问题处理】银河麒麟操作系统实例分享,adb读写缓慢问题分析

1.问题环境 处理器&#xff1a; HUAWEI Kunpeng 920 5251K 内存&#xff1a; 512 GiB 整机类型/架构&#xff1a; TaiShan 200K (Model 2280K) BIOS版本&#xff1a; Byosoft Corp. 1.81.K 内核版本 4.19.90-23.15.v2101.ky10.aarch64 第三方应用 数据库 2.问题…

OCP Java17 SE Developers 复习题14

答案 C. Since the question asks about putting data into a structured object, the best class would be one that deserializes the data. Therefore, ObjectInputStream is the best choice, which is option C. ObjectWriter, BufferedStream, and ObjectReader are no…

karpathy build make more --- 2

1 Introduction 用多层神经网络实现更复杂一点名字预测器。 2 方案 采用两层全连接层&#xff0c;中间采用tanh作为激活函数&#xff0c;最后一层用softmax&#xff0c;loss用cross-entropy. 2.1 实施 step1: 生成输入的字符,输入三个字符&#xff0c;输出一个字符. 采用了…

java的spring循环依赖、Bean作用域等深入理解

前言 通过之前的几篇文章将Spring基于XML配置的IOC原理分析完成&#xff0c;但其中还有一些比较重要的细节没有分析总结&#xff0c;比如循环依赖的解决、作用域的实现原理、BeanPostProcessor的执行时机以及SpringBoot零配置实现原理&#xff08;ComponentScan、Import、Impo…

推荐一款websocket接口测试工具

网址&#xff1a;Websocket在线测试-Websocket接口测试-Websocket模拟请求工具 http://www.jsons.cn/websocket/ 很简单输入以ws开后的网址就可以了 这个网址是你后台设置的 如果连接成功会砸提示框内显示相关字样&#xff0c;反之则不行

python爬虫之爬取携程景点评价(5)

一、景点部分评价爬取 【携程攻略】携程旅游攻略,自助游,自驾游,出游,自由行攻略指南 (ctrip.com) import requests from bs4 import BeautifulSoupif __name__ __main__:url https://m.ctrip.com/webapp/you/commentWeb/commentList?seo0&businessId22176&busines…

U.2 NVMe全闪存储阵列在高性能计算环境中的表现

用户利用高性能计算 (HPC) 先进的计算技术来执行大规模的复杂计算任务。这有助于短时间内解决复杂问题&#xff0c;与传统计算方法相比遥遥领先。Infortrend 存储解决方案专门针对密集型 HPC 工作负载进行了优化。新推出的U.2 NVMe全闪存储阵列GS 5024UE在0.3毫秒的延迟下提供1…

镭速助力企业集成OIDC实现安全高效的大文件数据传输

在当今数字化时代&#xff0c;企业尤其是科研机构、研究所和实验室等&#xff0c;对于大量敏感数据的传输安全和效率有着日益增长的需求。面对这一挑战&#xff0c;企业需要一种既能保障数据传输安全&#xff0c;又能提高传输效率的解决方案。镭速&#xff0c;作为一款面向企业…

【C++学习】C++4种类型转换详解

这里写目录标题 &#x1f680;C语言中的类型转换&#x1f680;为什么C需要四种类型转换&#x1f680;C强制类型转换&#x1f680;static_cast&#x1f680;**reinterpret_cast**&#x1f680;const_cast与volatile&#x1f680;dynamic_cast &#x1f680;C语言中的类型转换 在…

buuctf——[ZJCTF 2019]NiZhuanSiWei

buuctf——[ZJCTF 2019]NiZhuanSiWei 1.绕过file_get_contents()函数 file_get_contents函数介绍 定义和用法 file_get_contents() 把整个文件读入一个字符串中。 该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持&#xff0c;还会使用内存映射…