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

目录

链接. - 力扣(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.hqwc.cn/news/690664.html

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

相关文章

stm32——OLED篇

技术笔记! 一、OLED显示屏介绍(了解) 1. OLED显示屏简介 二、OLED驱动原理(熟悉) 1. 驱动OLED驱动芯片的步骤 2. SSD1306工作时序 三、OLED驱动芯片简介(掌握) 1. 常用SSD1306指令 2. …

清理缓存简单功能实现

在程序开发中,经常会用到缓存,最常用的后端缓存技术有Redis、MongoDB、Memcache等。 而有时候我们希望能够手动清理缓存,点一下按钮就把当前Redis的缓存和前端缓存都清空。 功能非常简单,创建一个控制器类CacheController&#xf…

Docker搭建ctfd平台

安装docker和docker-compose (1)安装docker: curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun(2)安装 Docker Compose: yum install docker-compose安装失败参考下面文章 https:/…

小程序获取手机号,用户昵称,头像

一、手机号 在微信小程序中,获取用户手机号也需要用户的明确授权。你可以使用 button 组件的 open-type 属性设置为 getPhoneNumber 来实现这个功能。当用户点击这个按钮时,会弹出一个对话框请求用户的授权。如果用户同意,你可以在 bindgetp…

C++入门——命名空间、缺省参数、函数重载、引用、内敛函数、auto关键字

目录 前言 一、什么是C 1.1 C关键字(C98) 二、命名空间 2.1 命名空间定义 1.正常命名空间的定义 2.命名空间的定义可以嵌套 3.同名的命名空间会合并 2.2 命名空间的使用 三、C输入&输出 四、缺省参数 4.1 缺省参数概念 4.2 缺省参数分类 五、函数重载 5.1 …

draw.io 网页版二次开发(3):打包和部署(war包)

目录 一 说明 二 环境配置 1. 下载并安装 Apache Ant 2. 下载并安装JDK和JRE 3. 下载tomcat 4. Ant、JDK和JRE 环境变量的配置 三 draw.io打包 四 部署 五 最后 一 说明 应公司项目要求,需要对draw.io进行二次开发,并将html界面通过iframe 嵌…

Github上 5 个好玩儿的开源项目

1. 在你的 Windows 养小猫 2. 把你的图片生成 ASCII 3. 中国制霸生成器 4. 像素风格代码字体 5. 梦回 QQ 空间 01 在你的 Windows 养小猫 在MacBook的触摸板上,你可以抚养一只小宠物,并与它互动、喂食,这样非常有趣。 我向你推荐了一个…

六级翻译笔记

理解加表达 除了专有名词不能自己理解翻译,其它都可以 时态一般唯一 题目里出现有翻译为 客观存在: there be 单词结尾加er和ee的区别:er是主动,ee是被动 中文句子没有被动,也可以英文翻译为被动 中文的状语可以不是…

Python | Leetcode Python题解之第84题柱状图中最大的矩形

题目: 题解: class Solution:def largestRectangleArea(self, heights: List[int]) -> int:n len(heights)left, right [0] * n, [n] * nmono_stack list()for i in range(n):while mono_stack and heights[mono_stack[-1]] > heights[i]:righ…

如何根据招聘信息打造完美简历

如何根据招聘信息打造完美简历 招聘信息分析简历调整策略个性化与关键词结语 在求职过程中,简历是第一块敲门砖。它不仅展示了你的专业技能和工作经验,还体现了你对所申请职位的理解和热情。然而,如何从招聘信息中提炼关键点,打造…

C# Linq中的自定义排序

1.开发过程中&#xff0c;会遇到OrderBy/OrderByDescending排序无法满足的情况&#xff0c;此时就需要自定义排序&#xff0c;按照想要的排序规则取排序&#xff0c;比如订单的状态等等。 2.自定义泛型比较器代码如下&#xff1a; /// <summary>/// 自定义泛型比较器(用…

Navicat连接MySQL数据库(新手版)

一、打开navicat软件 二、创建一个测试连接1、点击【连接】&#xff0c;选择【MySQL】 图标变绿表示连接成功