【Leetcode】队列实现栈和栈实现队列

 

  

目录

一.【Leetcode225】队列实现栈

1.链接

2.题目再现

 3.解法

二.【Leetcode232】栈实现队列

1.链接

2.题目再现

3.解法


一.【Leetcode225】队列实现栈

1.链接

队列实现栈

2.题目再现

 3.解法

这道题给了我们两个队列,要求去实现栈;

首先,我们要知道栈和队列的特征:

栈:后进先出,只能从栈顶入数据和出数据;

队列:先进先出,从队尾入数据,队头出数据;

根据这些特点,我们可以采用两边倒的方法来实现;

具体来说:

1.入栈时就是在不为空的队列插入数据,若两个队列都为空,就随便插入到一个队列中;

2.出栈时将不为空的队列的数据倒入为空的队列中,当不为空的队列就剩一个数据时,就停止向空队列倒数据,然后再删点那最后一个数据;

3.判空时,需要两个队列都为空,才算栈为空;

4.取栈顶元素即取不为空的队列的队尾元素,在取栈顶元素前要判断栈是否为空;

5.销毁栈时,要先销毁其中的两个队列,然后再销毁栈。

因为是用C语言实现的,所以得自己手搓个队列。

typedef int Qdatatype;

typedef struct QueueNode
{
	struct QueeuNode* next;
	Qdatatype data;
}QueueNode;

typedef struct Queue
{
	QueueNode* head;
	QueueNode* tail;
}Queue;
void Queueinit(Queue* pq)
{
	assert(pq);
	pq->head = NULL;
	pq->tail = NULL;
}

void Queuedestroy(Queue* pq)
{
	assert(pq);
	QueueNode* cur = pq->head;

	while (cur != pq->tail)
	{
		QueueNode* next = cur->next;
		free(cur);
		cur = next;
	}

	pq->head = pq->tail = NULL;
}

void Queuepush(Queue* pq, Qdatatype x)
{
	assert(pq);
	QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
	
	if (newnode == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	newnode->data = x;
	newnode->next = NULL;
	if (pq->head == NULL)
	{
		pq->head = pq->tail = newnode;
	}
	else
	{
		pq->tail->next = newnode;
		pq->tail = newnode;
	}
}

void Queuepop(Queue* pq)
{
	assert(pq);
	assert(pq->head);

	QueueNode* next = pq->head->next;
	if (pq->head->next == NULL)
	{
		free(pq->head);
		pq->head = pq->tail = NULL;
	}
	else
	{
		free(pq->head);
		pq->head = next;
	}
}

Qdatatype Queuefront(Queue* pq)
{
	assert(pq);
	assert(pq->head);

	return pq->head->data;
}

Qdatatype Queueback(Queue* pq)
{
	assert(pq);
	assert(Queuesize(pq) > 0);

	return pq->tail->data;
}

int Queuesize(Queue* pq)
{
	assert(pq);
	int size = 0;
	QueueNode* cur = pq->head;
	while (cur != pq->tail->next)
	{
		size++;
		cur = cur->next;
	}

	return size;
}

bool Queueempty(Queue* pq)
{
	assert(pq);

	return pq->head == NULL;
}

typedef struct 
{
    Queue q1;
    Queue q2;
} MyStack;

MyStack* myStackCreate() {
    MyStack*obj=(MyStack*)malloc(sizeof(MyStack));
    if(obj==NULL)
        exit(-1);
    Queueinit(&obj->q1);
    Queueinit(&obj->q2);

    return obj;
}

void myStackPush(MyStack* obj, int x) 
{
    if(!Queueempty(&obj->q1))
    {
        Queuepush(&obj->q1,x);
    }
    else
    {
        Queuepush(&obj->q2,x);
    }
}

int myStackPop(MyStack* obj) {
    Queue*empty=&obj->q1;
    Queue*noempty=&obj->q2;
    if(!Queueempty(&obj->q1))
    {
        empty=&obj->q2;
        noempty=&obj->q1;
    }
    while(Queuesize(noempty)>1)
    {
        Queuepush(empty,Queuefront(noempty));
        Queuepop(noempty);
    }
    int front=Queuefront(noempty);
    Queuepop(noempty);
    return front;
}

int myStackTop(MyStack* obj) {
    if(!Queueempty(&obj->q1))
    {
        return Queueback(&obj->q1);
    }
    else
    {
        return Queueback(&obj->q2);
    }
}
bool myStackEmpty(MyStack* obj) {
    
    return Queueempty(&obj->q1)&&Queueempty(&obj->q2);
}

void myStackFree(MyStack* obj) {

    Queuedestroy(&obj->q1);
    Queuedestroy(&obj->q2);

    free(obj);
}

二.【Leetcode232】栈实现队列

1.链接

栈实现队列

2.题目再现

3.解法

这个的解法和上面的类似,只不过这个不用总是来回倒;

根据栈和队列的特征,我们会发现将一个栈中的数据倒入另一个栈时,数据的顺序刚好符合队列的要求,不需要再重复地倒数据,所以我们可以让一个栈专门用来入数据(Pushst)一个栈专门用来出数据(Popst)当我们要出数据而这个栈为空时,我们才将用来入数据的栈中的数据倒入用来出数据的栈 。

如图:

1.判空时,需要两个栈都为空,队列才为空;

2.返回队头数据时,和出数据的操作类似,只是不需要删除队头的数据,还有在之前要判断队列是否为空;

3.销毁队列前,要先销毁两个栈。

同样,因为是C语言,得先手搓个栈。

#define MR_CAP 5
typedef int STdatatype;

typedef struct Stack
{
	STdatatype* arr;
	int top;
	int capacity;
}ST;

void Stackinit(ST* ps)
{
	assert(ps);

	ps->arr = (STdatatype*)malloc(MR_CAP * sizeof(STdatatype));
	if (ps->arr == NULL)
	{
		perror("Stackinit malloc");
		exit(-1);
	}

	ps->top = 0;
	ps->capacity = MR_CAP;
}

void Stackdestroy(ST* ps)
{
	assert(ps);

	free(ps->arr);
	ps->arr = NULL;
	ps->top = 0;
	ps->capacity = 0;
}

void Stackpush(ST* ps, STdatatype x)
{
	assert(ps);

	if (ps->top == ps->capacity)
	{
		STdatatype* tmp = (STdatatype*)realloc(ps->arr, ps->capacity * 2 * sizeof(STdatatype));
		if (tmp == NULL)
		{
			perror("Stackpush realloc");
			exit(-1);
		}
		else
		{
			ps->arr = tmp;
			ps->capacity *= 2;
		}
	}

	ps->arr[ps->top] = x;
	ps->top++;
}

void Stackpop(ST* ps)
{
	assert(ps);
	assert(ps->top > 0);

	ps->top--;
}

STdatatype Stacktop(ST* ps)
{
	assert(ps);

	return ps->arr[ps->top - 1];
}

int Stacksize(ST* ps)
{
	assert(ps);

	return ps->top;

}

bool Stackempty(ST* ps)
{
	assert(ps);

	if (ps->top == 0)
	{
		return true;
	}
	else
		return false;
	 
}

typedef struct {
    ST Pushst;
    ST Popst;
} MyQueue;

MyQueue* myQueueCreate() {
    MyQueue*obj=(MyQueue*)malloc(sizeof(MyQueue));
    if(obj==NULL)
        exit(-1);
    Stackinit(&obj->Pushst);
    Stackinit(&obj->Popst);

    return obj;
}

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

int myQueuePeek(MyQueue* obj) {
     if(Stackempty(&obj->Popst))
    {
        while(!Stackempty(&obj->Pushst))
        {
            Stackpush(&obj->Popst,Stacktop(&obj->Pushst));
            Stackpop(&obj->Pushst);
        }
    }

    return Stacktop(&obj->Popst);
    
}

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

bool myQueueEmpty(MyQueue* obj) {

    return Stackempty(&obj->Pushst)&&Stackempty(&obj->Popst);
}

void myQueueFree(MyQueue* obj) {
    Stackdestroy(&obj->Pushst);
    Stackdestroy(&obj->Popst);

    free(obj);
}

🐲👻这两道题的讲解就到这里了,若有错误或是建议欢迎小伙伴们指出。🐯🤖

🥰🤩希望小伙伴们可以多多支持博主哦。😍😃

😁😄谢谢你的阅读。😼😸

 

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

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

相关文章

8大核心语句,带你深入python

人生苦短 我用python 又来给大家整点好东西啦~ 咱就直接开练噜!内含大量代码配合讲解 python 安装包资料:点击此处跳转文末名片获取 1. for - else 什么?不是 if 和 else 才是原配吗? No,你可能不知道, else 是个…

Cache的地址结构,tag到底与Cache什么关系,Cache容量与总容量,Cache行长,Cache字地址?

目录.Cache映射的问题一.Cache的三种映射重点:那么我说1.直接映射2.全相联映射3.组相联映射4.总结三种映射二.Cache的三个字眼(例题)1.Cache字地址多少位(字地址即按字编址)2.Cache容量与总容量3.Cache行长一.Cache的三种映射 重点&#xff…

C++ 类与对象

结构体与类:在C语言中结构体可以存储一些不同类型的数据,这个功能就很强大了,但是这些数据都是不安全的我们可以在主函数中随意修改它,在C中的类可以很好的解决这个问题。类就相当于C语言中的结构体一样,C结构体&#…

GC 垃圾回收机制

文章目录JVM 的内存模型对象存活?引用计数算法可达性分析算法垃圾收集标记-清除算法标记-复制算法标记-整理算法垃圾收集器垃圾收集器发展Serial / Serial OldParallel Scavenge / Parallel OldParNew / CMSG1ZGC扩展JVM 的内存模型 Java 虚拟机(Java V…

转速/线速度/角速度计算FC

工业应用中很多设备控制离不开转速、线速度的计算,这篇博客给大家汇总整理。张力控制的开环闭环方法中也离不开转速和线速度的计算,详细内容请参看下面的文章链接: PLC张力控制(开环闭环算法分析)_plc的收卷张力控制系统_RXXW_Dor的博客-CSDN博客里工业控制张力控制无处不…

按键修改阈值功能、报警功能、空气质量功能实现(STM32)

按键修改阈值功能 要使用按键,首先要定义按键。通过查阅资料,可知按键的引脚如图所示:按键1(S1)通过KEY0与PA0连接,按键2(S2)通过KEY1与PE2连接,按键3(S3&…

收到6家大厂offer,我把问烂了的《Java八股文》打造成3个文档。共1700页!!

前言大家好,最近有不少小伙伴在后台留言,近期的面试越来越难了,要背的八股文越来越多了,考察得越来越细,越来越底层,明摆着就是想让我们徒手造航母嘛!实在是太为难我们这些程序员了。这不&#…

【LINUX】初识文件系统

文章目录一、前言二、回顾C语言文件操作三、初识系统调用openreadwriteclose四、文件系统初识五、结语一、前言 二、回顾C语言文件操作 int main() {FILE* fp fopen("log.txt", "w");if (fp NULL){perror("fopen");}int cnt 0;fputs("…

spring2

1.Spring配置数据源1.1 数据源(连接池)的作用 数据源(连接池)是提高程序性能如出现的事先实例化数据源,初始化部分连接资源使用连接资源时从数据源中获取使用完毕后将连接资源归还给数据源常见的数据源(连接池):DBCP、C3P0、BoneC…

js实现一个简单的扫雷

目录先看下最终的效果:首先来分析一个扫雷游戏具有哪些功能分析完成后我们就开始一步步的实现1. 相关html和css2. 我们使用类来完成相应功能3. 之后我们则是要定义一个地图4. 对地图进行渲染5. 对开始按钮添加点击事件6. 现在我们可以实现鼠标左击扫雷的功能7. 给单…

网络知识汇总

文章目录一、 [网络拓扑结构](https://blog.csdn.net/weixin_52140964/article/details/127786157)二、[空间组网](https://blog.csdn.net/weixin_43509834/article/details/123225995)三、卫星网络发展历程四、SDN的由来五、ECMP、WCMP一、 网络拓扑结构 又称分布式结构。 任…

面试热点题:回溯算法 电话号码的字母组合与组合总和

前言: 如果你一点也不了解什么叫做回溯算法,那么推荐你看看这一篇回溯入门,让你快速了解回溯算法的基本原理及框架 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。…

2023/3/21总结

题解: E - 2xN Grid (atcoder.jp) 1.这一题,就是求出第一行与第二行相对应的相同数字的个数,看数据有多大,我们就知道,这道题目,是不可能穷举的。 2.因此,我们需要 找到规律去写它。此题需要…

最新消息!信息系统项目管理师教程改版!

《信息系统项目管理师教程(第4版)》于2023年3月出版 新版《信息系统项目管理师考试大纲》于2023年3月出版 信息系统项目管理师教程改版说明 一、整体说明 1、教材整体说明:第四版教材由25章组成,相比第三版28章内容减少了3章主要…

硬件速攻-AT24CXX存储器

AT24C02是什么? AT24CXX是存储芯片,驱动方式为IIC协议 实物图? 引脚介绍? A0 地址设置角 可连接高电平或低电平 A1 地址设置角 可连接高电平或低电平 A2 地址设置角 可连接高电平或低电平 1010是设备前四位固定地址 &#xf…

QT | 编写一个简单的上位机

QT | 编写一个简单的上位机 时间:2023-03-19 参考: 1.易懂 | 手把手教你编写你的第一个上位机 2.QT中修改窗口的标题和图标 3.图标下载 1.打开QT Creator 2.新建工程 Qt Creator 可以创建多种项目,在最左侧的列表框中单击“Application”&am…

学校教的Python,找工作没企业要,太崩溃了【大四真实求职经历】

如果只靠学校学的东西去找工作,能找到工作吗? 今天给大家看一个粉丝的真实求职案例,想做Python方面的工作,投了二十几个简历却没人要,心态崩了。为什么没人要?我来告诉你答案。 然后我还会结合我的这些年的…

Linux--线程安全、多线程fork问题

目录 一、概念: 二、利用空格分割字符串: 1.代码: 2.结果: 3.解决方法: 三、多线程fork() 1.代码: 2.线程id 3.增加fork()代码: 4.改变fo…

【嵌入式硬件芯片开发笔记】HART协议调制解调芯片AD5700配置流程

【嵌入式硬件芯片开发笔记】HART协议调制解调芯片AD5700配置流程 XTAL_EN接地,CLK_CFG的两个引脚由同一个GPIO控制 初始时HART_CLK_CFG输出低电平 由RTS引脚控制调制/解调。当RTS处于高电平时,为解调(输入);否则为调…

【计算机组成原理】:计算机系统概述

目录 一、计算机系统层次结构 1️⃣计算机系统的组成 2️⃣计算机硬件 1. 冯诺依曼机的基本思想 💤思考:冯诺依曼机的来源❓ 🌸知识点:冯诺依曼机的特点 💤思考:以运算器为中心的计算机有什么缺点❓ 2…