(动画详解)LeetCode232.用栈实现队列

news2024/11/27 9:57:29

💖💖💖欢迎来到我的博客,我是anmory💖💖💖
又和大家见面了
欢迎来到动画详解LeetCode算法系列
用通俗易懂的动画让算法题不再神秘
先来自我推荐一波
个人网站欢迎访问以及捐款
推荐阅读
如何低成本搭建个人网站
专栏:动画详解leetcode算法题
C语言知识

玉桂狗yay

题目描述

题目描述


解题思路

这道题我们引入两个栈,一个用来入栈,一个用来出栈
这样,出栈的栈顶元素就是队列的队头元素了


动画详解

用栈实现队列


代码实现

这里由于使用的是C语言,需要自己写栈
所以代码量会比较多,大家不要被吓到了哈

typedef int DataType;

// 定义一个栈,包含数据,栈顶元素下标,栈的大小
struct Stack
{
	DataType* data;
	int top;
	int capacity;
};

typedef struct Stack Stack;

// 栈的初始化
void StackInit(Stack* st)
{
    assert(st);
	st->data = NULL;
	st->capacity = 0;
	// top指向栈顶元素的下一个
	st->top = 0;
}

// 入栈
void StackPush(Stack* st, DataType x)
{
	assert(st);
	if (st->top == st->capacity)
	{
		int newcapacity = st->capacity == 0 ? 4 : st->capacity * 2;
		DataType* new = (DataType*)realloc(st->data,newcapacity*sizeof(DataType));
		// 如果开辟失败
		if (new == NULL)
		{
			perror("malloc fail");
			return;
		}
		// 如果开辟成功
		st->data = new;
		st->capacity = newcapacity;
	}
	st->data[st->top] = x;
	st->top++;
}

// 出栈
void StackPop(Stack* st)
{
	assert(st);
	st->top--;
}

// 栈的判空
bool StackIsEmpty(Stack* st)
{
	assert(st);
	if (st->top == 0)
	{
		return true;
	}
	else
	{
		return false;
	}
}

// 返回栈顶元素
DataType StackTop(Stack* st)
{
	assert(st);
	assert(st->top > 0);
	return st->data[st->top - 1];
}

// 栈的大小
int StackSize(Stack* st)
{
	assert(st);
	return st->top;
}

// 栈的销毁
void StackDestroy(Stack* st)
{
	assert(st);
	free(st->data);
	st->data = NULL;
	st->top = st->capacity = 0;
}


typedef struct 
{
    Stack pushst;
    Stack popst;
} MyQueue;


MyQueue* myQueueCreate() 
{
    MyQueue* new = (MyQueue*)malloc(sizeof(MyQueue));
    StackInit(&(new->pushst));
    StackInit(&(new->popst));
    return new;
    
}

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

int myQueuePeek(MyQueue* obj);

int myQueuePop(MyQueue* obj) 
{
    int front = myQueuePeek(obj);
    StackPop(&(obj->popst));
    return front;
}

int myQueuePeek(MyQueue* obj) 
{
    if(StackIsEmpty(&(obj->popst)))
    {
        // 导入数据
        while(!StackIsEmpty(&(obj->pushst)))
        {
            int top = StackTop(&(obj->pushst));
            StackPush(&(obj->popst),top);
            StackPop(&(obj->pushst));
        }
    }
    return StackTop(&(obj->popst));
    
}

bool myQueueEmpty(MyQueue* obj) 
{
    return StackIsEmpty(&(obj->pushst)) && StackIsEmpty(&(obj->popst));
    
}

void myQueueFree(MyQueue* obj) 
{
    StackDestroy(&(obj->pushst));
    StackDestroy(&(obj->popst));
    free(obj);
    obj = NULL;
    
}

/**
 * Your MyQueue struct will be instantiated and called as such:
 * MyQueue* obj = myQueueCreate();
 * myQueuePush(obj, x);
 
 * int param_2 = myQueuePop(obj);
 
 * int param_3 = myQueuePeek(obj);
 
 * bool param_4 = myQueueEmpty(obj);
 
 * myQueueFree(obj);
*/

复杂度分析

O(n)啦


总结

💖💖💖非常感谢各位的支持💖💖💖
我们共同进步
本系列持续更新,关注我,带你手撕算法题
下期再见
玉桂狗yay

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

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

相关文章

GitHub 星标高达9k star,这款高颜值的JSON可视化工具,我滴个妈呀,太惊艳了

闲言碎语太多了 所以做好自己就好啦 你把我丢下 然后告诉我好好生活 你明知道我的快乐只与你有关 你却告诉我 我自由了 一切都会变好的 比如从穷变成好穷 ​ 众所周知。json已经是程序员最常打交道的一种数据组织的方式。无论是前端还是后端,都有许多关于json的…

ohmyzsh的安装过程中失败拒绝连接问题的解决

1.打开官网Oh My Zsh - a delightful & open source framework for Zsh 在官网能看到下面的界面 有这两种自动安装的方式 个人本次选择的是: wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O - 1.打开终端输入安装的指令 sh -c "$(wget…

【论文阅读】Machine Learning, Linear Algebra, and More: Is SQL All You Need?

文章目录 摘要一、介绍二、SQL算法原语2.1、Variables2.2、Functions2.3、Conditions2.4、Loops2.5、Errors 三、案例研究3.1、对数据库友好的SQL映射3.2、性能结果 四、结论以及未来工作 摘要 尽管SQL在简单的分析查询中无处不在,但它很少用于更复杂的计算&#xf…

实习大学生如何在Purple Pi OH鸿蒙开发板下调试Android串口?

本文适用于Purple Pi OH在Android固件后串口的开发与使用。触觉智能的Purple Pi OH鸿蒙开源主板,是华为Laval官方社区主荐的一款鸿蒙开发主板。 该主板主要针对学生党,极客,工程师,极大降低了开源鸿蒙开发者的入门门槛&#xff0c…

如何利用甘特图来提高资源的是使用效率?

在项目管理中,甘特图是一种常用的工具,用于规划和跟踪项目进度。它通过条形图的形式展示项目的时间表和任务依赖关系,帮助项目经理和团队成员清晰地了解项目的时间线和进度。通过合理利用甘特图,可以显著提高资源的使用效率&#…

【话题】软件开发的航海图:程序员的实用神器探秘

大家好,我是全栈小5,欢迎阅读小5的系列文章,这是《话题》系列文章 目录 背景一、代码编写二、版本控制三、测试与调试四、部署与运维五、总结文章推荐 背景 在软件开发的广阔海洋中,每一位程序员都是一位勇敢的航海家&#xff0c…

安卓手机数据恢复全攻略:从备份到专业软件一网打尽!

随着科技的飞速发展,我们的生活中越来越离不开手机。然而,在使用手机的过程中,我们可能会遇到数据丢失的问题。对于安卓手机用户来说,如何有效地恢复丢失的数据是一个值得探讨的问题。本文将为您介绍安卓手机数据恢复的全攻略&…

[笔试强训day08]

文章目录 HJ108 求最小公倍数NC95 数组中的最长连续子序列DP39 字母收集 HJ108 求最小公倍数 HJ108 求最小公倍数 #include<iostream>using namespace std;int a,b;int gcd(int a,int b) {if(b0) return a;return gcd(b,a%b); } int main() {cin>>a>>b;int …

NoSql数据存储:Redis

NoSql 数据存储&#xff1a;Redis 前言安装在Windows上安装Redis在Linux上源代码安装Redis远程连接 基本操作常用命令stringhashlistsetzset SpringBoot整合Redis基本使用项目案例排行榜应用&#xff0c;取浏览量最高TOP N数据的操作需要精确设定过期时间的应用计数器应用Uniq操…

一站式健康管理平台,让健康触手可及

如何有效地管理慢性病&#xff0c;提高患者的健康水平&#xff0c;成为国家和社会关注的焦点。慢病健康管理系统应运而生&#xff0c;以其一站式健康管理平台的特性&#xff0c;让健康触手可及。 一、打破壁垒&#xff0c;以医疗标准做健康管理 慢病健康管理系统不仅打破了医疗…

【多模态】30、GPT4V_OCR | GPT4V 在 OCR 数据集上效果测评

文章目录 一、背景二、测评2.1 场景文本识别2.2 手写文本识别2.3 手写数学公式识别2.4 图表结构识别&#xff08;不考虑单元格中的文本内容&#xff09;2.5 从内容丰富的文档中抽取信息 三、讨论 论文&#xff1a;EXPLORING OCR CAPABILITIES OF GPT-4V(ISION) : A QUANTITATIV…

Faster Ring-Packing via BST and Ring-Switch

参考文献&#xff1a; [GHPS12] Gentry C, Halevi S, Peikert C, et al. Ring switching in BGV-style homomorphic encryption[C]//International Conference on Security and Cryptography for Networks. Berlin, Heidelberg: Springer Berlin Heidelberg, 2012: 19-37.[GHP…

vue 发布项目

You are not allowed to force push code to a protected branch on this project. 分支做了保护&#xff0c;git中设置允许强制推送

【电路笔记】-无源带通滤波器

无源带通滤波器 文章目录 无源带通滤波器1、概述2、二阶带通滤波器的频率响应3、带通滤波器示例4、总结无源带通滤波器可以通过将低通滤波器与高通滤波器连接在一起制成。 1、概述 无源带通滤波器可用于隔离或滤除特定频带或频率范围内的某些频率。 简单 RC 无源滤波器中的截止…

咸鱼之王游戏攻略:平民怎么起号?

在《咸鱼之王》这款游戏中&#xff0c;即使是平民玩家&#xff0c;也有着许多可以优化的操作&#xff0c;以最大程度地提高收益。本攻略将针对平民玩家的日常操作进行详细解读&#xff0c;包括黑市购买、资源管理等方面的建议&#xff0c;希望对广大玩家有所帮助。 一、黑市购买…

Sublime Text for Mac:强大的文本编辑器

Sublime Text for Mac&#xff0c;一款轻量而强大的文本编辑器&#xff0c;为您的编程和写作工作带来无限可能。它以其简洁的界面和出色的性能&#xff0c;成为Mac用户中备受推崇的编辑器之一。 Sublime Text支持多种编程语言&#xff0c;无论是Python、JavaScript、HTML还是CS…

MoneyPrinter国内版改造

背景&#xff1a; MoneyPrinter 是一个自动生成短视频的开源项目。只需要输入短视频主题&#xff0c;然后就可以生成视频。 在国内环境运行时&#xff0c;框架中使用的youtube、抖音文字转语音等功能无法使用&#xff0c;需要对框架进行国内版改造&#xff0c;使其使用国内网络…

Vue路由开启步骤

1.在控制台输入命令 //控制台下载安装npm add vue-router3.6.5 2.在main.js下导入并注册组件 import Vue from vue import App from ./App.vue//控制台下载安装npm add vue-router3.6.5 //导入 import VueRouter from "vue-router";//注册 Vue.use(VueRouter) con…

巩固学习7

正则表达式 就是用来找到符合模式的字符串&#xff0c;这些模式包括&#xff1a;是什么字符&#xff0c;重复多少次&#xff0c;在什么位置&#xff0c;有哪些额外的约束 找某个字符串 import re text身高:178 体重:168 学号:123456 密码:9527 #在Python中&#xff0c;r前缀用…

【软考高项】四十五、项目管理科学计算之工程经济学

一、资金的时间价值与等值计算的概念 1、资金的时间价值是指不同时间发生的等额资金在价值上的差别。 2、把资金存入银行,经过一段时间后也会产生增值,这就是利息。 例如,在年利率为5.22%条件下&#xff0c;当年的100元与下一年的105.22元是等值的,即100 &#xff08;15.22%&a…