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

💖💖💖欢迎来到我的博客,我是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

相关推荐

  1. LeetCode232实现队列

    2024-05-14 12:00:20       36 阅读
  2. Leetcode 232实现队列

    2024-05-14 12:00:20       42 阅读
  3. LeetCode-232. 实现队列 设计 队列

    2024-05-14 12:00:20       46 阅读
  4. 232.实现队列

    2024-05-14 12:00:20       39 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-14 12:00:20       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-14 12:00:20       101 阅读
  3. 在Django里面运行非项目文件

    2024-05-14 12:00:20       82 阅读
  4. Python语言-面向对象

    2024-05-14 12:00:20       91 阅读

热门阅读

  1. nginx配置(多个前端)

    2024-05-14 12:00:20       31 阅读
  2. LeetCode例题讲解:781.森林中的兔子

    2024-05-14 12:00:20       25 阅读
  3. 【思维】根号分治

    2024-05-14 12:00:20       32 阅读
  4. Vue3:介绍

    2024-05-14 12:00:20       26 阅读
  5. Android 开机过程画面

    2024-05-14 12:00:20       32 阅读
  6. iOS学习- iOS获取指定月的天数

    2024-05-14 12:00:20       23 阅读
  7. vue3基于elementplus 简单实现表格二次封装

    2024-05-14 12:00:20       30 阅读
  8. 【Vue】vue中动态样式绑定

    2024-05-14 12:00:20       30 阅读
  9. 《创意代码:Processing艺术编程之旅》系列目录

    2024-05-14 12:00:20       32 阅读
  10. ArrayList与LinkedList的区别

    2024-05-14 12:00:20       34 阅读
  11. 【Golang】Golang 的 HTTP 使用 Header 指南

    2024-05-14 12:00:20       27 阅读