力扣例题(用栈实现队列)

2024-05-12 03:04

本文主要是介绍力扣例题(用栈实现队列),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

链接. - 力扣(LeetCode)

描述

思路

push

pop

peek

empty

代码


链接
. - 力扣(LeetCode)

描述

思路

push

例如我们将10个元素放入栈中,假设最左边为栈顶,最右侧为栈底

则为10,9,8,7,6,5,4,3,2,1

pop

从队列的开头移除并返回元素,队列的开头为最右侧的1

我们先将前面的元素放入空栈中

空栈中元素顺序为2,3,4,5,6,7,8,9,10

我们发现元素顺序反了,说明等下要反转回来

此时原栈中只剩最后一个元素1,我们将1拷贝下来并踢出去即可

此时原栈成为空栈,我们将元素全部放回去即可,原栈顺序改为10,9,8,7,6,5,4,3,2

通过反转我们就顺利的将队列中的第一个元素1给删除了

peek

返回队列开头元素与pop思路基本一致,唯一的不同点为原栈中不需要再将元素1删去,拷贝后直接将元素全部取回来即可。

empty

两个栈均不为空指针即可

代码

typedef int STDataType;
typedef struct Stack
{STDataType* _a;int _top;		// 栈顶int _capacity;  // 容量 
}Stack;
// 初始化栈 
void StackInit(Stack* ps);
// 入栈 
void StackPush(Stack* ps, STDataType data);
// 出栈 
void StackPop(Stack* ps);
// 获取栈顶元素 
STDataType StackTop(Stack* ps);
// 获取栈中有效元素个数 
int StackSize(Stack* ps);
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps);
// 销毁栈 
void StackDestroy(Stack* ps);
void StackInit(Stack* ps) {ps->_a = NULL;ps->_capacity = 0;ps->_top = -1;
}
void StackPush(Stack* ps, STDataType data) {if (ps->_capacity == ps->_top + 1) {int newcapacity = ps->_capacity == 0 ? 4 : 2 * ps->_capacity;STDataType* tmp = (STDataType*)realloc(ps->_a, newcapacity * sizeof(STDataType));if (tmp == NULL) {perror("realloc error");return;}ps->_a = tmp;ps->_capacity = newcapacity;}ps->_top++;ps->_a[ps->_top] = data;
}
void StackPop(Stack* ps) {if (ps->_top == -1) {return;}ps->_top--;
}
STDataType StackTop(Stack* ps) {return ps->_a[ps->_top];
}
int StackSize(Stack* ps) {return ps->_top + 1;
}
int StackEmpty(Stack* ps) {if (ps->_top == -1)return 1;return 0;
}
void StackDestroy(Stack* ps) {ps->_capacity = 0;ps->_top = -1;free(ps->_a);ps->_a = NULL;
}
typedef struct {Stack s1;Stack s2;
} MyQueue;MyQueue* myQueueCreate() {MyQueue* mn = (MyQueue*)malloc(sizeof(MyQueue));StackInit(&(mn->s1));StackInit(&(mn->s2));return mn;
}void myQueuePush(MyQueue* obj, int x) {Stack* nonempty = &(obj->s1), * empty = &(obj->s2);if (StackEmpty(nonempty)) {nonempty = &(obj->s2);empty = &(obj->s1);}StackPush(nonempty, x);
}int myQueuePop(MyQueue* obj) {Stack* nonempty = &(obj->s1), * empty = &(obj->s2);int a;if (StackEmpty(nonempty)) {nonempty = &(obj->s2);empty = &(obj->s1);}while (StackSize(nonempty) != 1) {StackPush(empty, StackTop(nonempty));StackPop(nonempty);}a = StackTop(nonempty);StackPop(nonempty);while (StackSize(empty) != 0) {StackPush(nonempty, StackTop(empty));StackPop(empty);}return a;
}int myQueuePeek(MyQueue* obj) {Stack* nonempty = &(obj->s1), * empty = &(obj->s2);if (StackEmpty(nonempty)) {nonempty = &(obj->s2);empty = &(obj->s1);}while (StackSize(nonempty) != 1) {StackPush(empty, StackTop(nonempty));StackPop(nonempty);}int a = StackTop(nonempty);while (StackSize(empty) != 0) {StackPush(nonempty, StackTop(empty));StackPop(empty);}return a;
}bool myQueueEmpty(MyQueue* obj) {if (StackEmpty(&(obj->s2)) && StackEmpty(&(obj->s1)))return true;return false;
}void myQueueFree(MyQueue* obj) {StackDestroy(&(obj->s1));StackDestroy(&(obj->s2));free(obj);
}

这篇关于力扣例题(用栈实现队列)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/981423

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import