用栈实现队列——leetcode刷题

        题目要求我们只用栈的基本操作 push to top 入栈,peek from top 返回栈顶元素,pop from top 移除并返回栈顶元素,size 栈的大小,is_empty 判断栈是否为空,这几个函数来实现队列,也就是说,我们在队列函数push pop peek empty函数中要调用栈的函数实现。

        首先栈的特点是先进后出,队列的特点是先进先出,如何用两个栈来实现先进先出,我们想到可以把一个栈压入另外一个栈,此时第二个栈的顺序相对第一个就是一个倒序,此时在出栈就是相当于首元素出栈,就相当于队列的逻辑。如图所示,我们还要做的就是把 栈2 的剩余元素重新入栈更新 栈1 。

        我们可以把 栈1 理解为队列的真实情况,栈2 只是出队列时寻找队头的工具(负责逆序栈),每次出队列之后都要重新更新 栈1 ,更新队列。

接下来就是代码实现:

typedef struct {
    struct Stacklist* p1;
    struct Stacklist* p2;
} MyQueue;
struct Stacklist* Stackcreat() {
    struct Stacklist* p = (struct Stacklist*)malloc(sizeof(struct Stacklist));
    return p;
}
void StackInit(struct Stacklist* stack) {
    stack->cap = 0;
    stack->size = 0;
    stack->val = NULL;
}
MyQueue* myQueueCreate() {
    MyQueue* list = (MyQueue*)malloc(sizeof(MyQueue));
    list->p1 = Stackcreat();
    list->p2 = Stackcreat();
    StackInit(list->p1);
    StackInit(list->p2);

    return list;
}

        首先是Queue队列结构体的成员,两个指向栈的指针:栈1 p1,栈2 p2 。其次是创建队列指针,创建队列中两个栈的指针,对他们进行初始化。(这里使用了题目要求之外的函数,个人感觉不妥,当然可以自己写一下)

接着是入队列函数:

void myQueuePush(MyQueue* obj, int x) {
    StackPush(obj->p1, x);
}

        直接就是入栈函数,因为进入第一个栈就相当于是入队列了。

然后是出队列函数 Pop(移除元素):

int myQueuePop(MyQueue* obj) {
    while (!is_empty(obj->p1)) {
        StackPush(obj->p2, StackPop(obj->p1));
    }
    int val = StackPop(obj->p2);
    while (!is_empty(obj->p2)) {
        StackPush(obj->p1, StackPop(obj->p2));
    }
    return val;
}

        我们先把 栈1 的元素压入 栈2 中去,即StackPush(obj->p2, StackPop(obj->p1)); 条件是 栈1 不为空,当条件不满足则说明 栈1 中元素已经全部拷贝到 栈2 中去,接着让 栈2 出栈,记录出栈的数值,然后再把 栈2 拷贝回 栈1 。这一流程就是刚才的图的流程。

然后是查看队头数值函数 Peek(不移除元素,仅查看):

int myQueuePeek(MyQueue* obj) {
    while (!is_empty(obj->p1)) {
        StackPush(obj->p2, StackPop(obj->p1));
    }
    int val = StackPeek(obj->p2);
    while (!is_empty(obj->p2)) {
        StackPush(obj->p1, StackPop(obj->p2));
    }
    return val;
}

        逻辑和出队列函数一样,只不过val赋值时使用的是StackPeek函数,也就是只查看不删除的"出栈"函数。

最后是判断队列是否为空的函数:

bool myQueueEmpty(MyQueue* obj) {
    if (is_empty(obj->p1)) {
        return true;
    }
    else {
        return false;
    }
}

        直接根据 栈1 是否为空来判断队列是否为空即可,因为我们每次都会拷贝回 栈1 保证 栈1 是队列的真实元素。

最后补充一下销毁函数:

void myQueueFree(MyQueue* obj) {
    StackDes(obj->p1);
    StackDes(obj->p2);
    free(obj);
    obj = NULL;
}
void StackDes(struct Stacklist* stack) {
    free(stack->val);
    stack->val = NULL;
}

        这里我我同样使用了外部函数,可以整合一下。

这就是文章的全部内容了,希望对你有所帮助,如有错误欢迎评论。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux字符设备驱动-详解与实操:驱动架构、设备树、Pinctrl子系统和GPIO子系统、platform、设备树下的platform

如何编写一个驱动程序: (1)确定主设备号 (2)定义自己的file_operations结构体: 包含对应的open(drv_open)/read(drv_read)等设备操作函数,需要到内核中去注册 (3)实现…

OpenAI最大对手推出iOS版APP 以期与ChatGPT展开竞争 | 最新快讯

财联社 5 月 2 日讯(编辑牛占林)美东时间周三,人工智能(AI)初创公司 Anthropic 宣布推出一款免费的移动端应用程序(APP),不过目前仅有 iOS 版本。 这款应用名为 Claude,与 Anthropic 的大模型系列名字相同。Anthropic …

基于Python的在线学习与推荐系统设计与实现(论文+源码)-kaic

题目:在线学习与推荐系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本在线学习与推荐系统就是在这样的大环境下诞生&#xff0…

macbook文件管理,这款神器不得不说 macbook文件管理技巧 macbookpro文件管理软件

使用MacBook办公就是看重高效的特点,但很多时候随着使用时间的增长,MacBook上的文件也会越来越多,如果没有很好的管理方式,只会给日常的使用造成诸多不便。如何更好的搞定macbook文件管理呢,且看下面几个方法&#xff…

新势力4月交付量比拼:理想超问界夺冠,小米首月交付超七千辆 | 最新快讯

理想汽车超越问界夺下 4 月新势力交付量冠军。 5 月 1 日,各大造车新势力纷纷亮出最新成绩。新入局者小米汽车也准时发布了交付数据,在交付首月,同时又是非完整交付月,小米就交出了超七千辆的好成绩,在造车新势力中尚属…

ngrinder项目-本地调试遇到的坑

前提-maven mirrors配置 <mirrors><!--阿里公有仓库--><mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</ur…

【计算机网络】网络层总结

目录 知识梗概 IP地址 子网划分 IP包头格式 路由 网络层协议 ARP病毒/ARP欺骗 知识梗概 IP地址 IP相关介绍&#xff1a;机器之间需要交流&#xff0c;必须要一个地址才能找到对应的主机&#xff0c;IP地址是主机的一种表示&#xff0c;保证主机之间的正常通信&#xff…

1083 是否存在相等的差

solution 输出的是重复的差值&#xff0c;而非全部差值 #include<iostream> #include<algorithm> using namespace std; const int maxn 1e4 10; int flag[maxn] {0}; int main(){int n, x;scanf("%d", &n);for(int i 1; i < n; i){scanf(&…

STM32 串口IDLE接收空闲中断+DMA

参考 http://t.csdnimg.cn/fAV38 1.基础知识 STM32 IDLE 接收空闲中断 功能&#xff1a; 在使用串口接受字符串时&#xff0c;可以使用空闲中断&#xff08;IDLEIE置1&#xff0c;即可使能空闲中断&#xff09;&#xff0c;这样在接收完一个字符串&#xff0c;进入空闲状态时&…

分布式与一致性协议之Raft算法(一)

Raft算法 概述 Raft算法属于Multi-Paxos算法&#xff0c;它在兰伯特Multi-Paxos思想的基础上做了一些简化和限制&#xff0c;比如日志必须是连续的&#xff0c;只支持领导者(Leader)、跟随者(Follwer)和候选人(Candidate)3种状态。在理解和算法实现上&#xff0c;Raft算法相对…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-6.5--I.MX6U启动方式

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

想要吃瓜,就要学会,在不必要的冲突发生时,沉默就是一种智慧——早读(逆天打工人爬取热门微信文章解读)

练习一下怼人的本事 引言Python 代码第一篇 洞见 养生的尽头&#xff0c;是养格局第二篇 人民日报 来啦 早班新闻车要闻社会 政策结尾 沉默是智者的选择 在不必要的冲突面前 选择沉默是一种智慧 引言 昨天下午睡醒 看到群里有些言论 遂 battle了一波 给大家吃吃瓜 到中午 车…

Codeforces Round 941 (Div. 2) D. Missing Subsequence Sum

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e18, maxm 4e4 5; c…

网络安全之弱口令与命令爆破(中篇)(技术进阶)

目录 一&#xff0c;什么是弱口令&#xff1f; 二&#xff0c;为什么会产生弱口令呢&#xff1f; 三&#xff0c;字典的生成 四&#xff0c;使用Burpsuite工具验证码爆破 总结 笔记改错 一&#xff0c;什么是弱口令&#xff1f; 弱口令就是容易被人们所能猜到的密码呗&a…

MyBatis中的#{} 和 ${}

目录 #{} 和 ${} 预编译 SQL 和 即时 SQL SQL注入 ${}的使用 #{} 和 ${}的使用 MyBatis参数赋值有两种方式&#xff0c;在上一篇文章中&#xff0c;一直使用 #{} 进行赋值&#xff0c;接下来&#xff0c;我们来使用 ${} 进行赋值&#xff0c;并观察 #{} 和 ${} 的区别 使用…

2024年外贸企业邮箱最新排名

外贸企业在与客户沟通中的重要工具就是企业邮箱&#xff0c;那么外贸企业邮箱哪个比较好呢&#xff1f;本文聚焦2024年外贸企业邮箱市场的最新动态&#xff0c;通过对五个领先品牌的深度对比&#xff0c;旨在为企业决策者提供详尽参考。首当其冲的是备受瞩目的Zoho Mail企业邮箱…

JMeter性能压测脚本录制

第一步&#xff1a;电脑打开控制面板设置代理服务器 第二步&#xff1a;jmeter的测试计划添加一个HTTP&#xff08;S&#xff09;脚本记录器 在脚本记录器里配置好信息&#xff0c;然后保存为脚本文件&#xff08;.*表示限定&#xff09; 此方框内容为项目地址&#xff08;可改…

字符串函数与字符函数运用(1)

字符串与字符函数介绍1 前言一、字符分类函数字符函数练习 二、字符函数转换1.引入库2.代码改进 字符串函数strlen函数strcpy 结尾 前言 字符串函数大概有以下这几种 strcpy、strcat 、strcmp、strncpy、strncat、strncmp、strstr、strtok、strerror 这些函数可以很好的解决你…

DRF中的请求入口分析及request对象分析

DRF中的请求入口分析及request对象分析 django restframework框架是在django的基础上又给我们提供了很多方便的功能&#xff0c;让我们可以更便捷基于django开发restful API 1 drf项目 pip install django pip install djangorestframework1.1 核心配置 INSTALLED_APPS [d…

神经网络中常见的激活函数:理解与实践

神经网络中常见的激活函数&#xff1a;理解与实践 在神经网络中&#xff0c;激活函数是一个非常重要的组成部分&#xff0c;它为神经元引入了非线性特性&#xff0c;使得神经网络可以拟合各种复杂的函数关系。本文将介绍9种常见的激活函数&#xff0c;包括它们的概述、公式以及…
最新文章