LeetCode - 232.用栈实现队列 225.用队列模拟实现栈 (C语言,配图)

news2024/11/17 13:22:13

目录

232.用栈实现队列

225.用队列模拟实现栈  


    注:本文是基于C语言实现的代码,所以栈和队列是在力扣上制造实现的,如果你使用C++等语言,可以忽略前面相当大部分的代码。

    在栈模拟实现栈和队列之前,我们先来复习一下栈和队列的定义,你必须对栈和队列有详细的了解,并模拟实现过,否则,一下实现对你的理解可能较为困难。

        栈:只允许一端(栈顶)进行插入和删除操作。

        队列:只允许一端进行插入,令一端进行删除操作。

数据结构入门————栈和队列(C语言/零基础/小白/新手+模拟实现+例题讲解)-CSDN博客

232.用栈实现队列

232. 用栈实现队列 - 力扣(LeetCode)

        对于队列,我们使用链式结构,进行尾插和头插,如果我们只使用一个栈来说,这是非常困难的,那我们就转变一下思路,使用两个栈来实现。这里我们叫一个为emptys(空栈),另一个叫nonemptys(非空栈)

        当我们想要插入时直接尾插到nonemptys(如果是第一次插入,无所谓emptys,nonemptys)。

        想要删除时,就将nonemptys栈的第二个及以后的数据插入到emptys中,然后将nonemptys中第一个数据删除,最后再将emptysz栈数据导入nonemptys中。

        

注:因为C语言,并没有对顺序栈的实现,所以我们要自己定义一个顺序栈结构。


typedef int STDataType;

typedef struct Stack
{
    STDataType* a;
    int top;
    int capacity;
}ST;

//初始化
void StackInit(ST* pst)
{
    assert(pst);
    pst->a = NULL;
    pst->top = 0;
    pst->capacity = 0;
}

//销毁
void StackDestroy(ST* pst)
{
    assert(pst);
    free(pst->a);
    pst->a = NULL;
    pst->top = 0;
    pst->capacity = 0;
}

//插入
void StackPush(ST* pst, STDataType x)
{
    assert(pst);
    if (pst->top == pst->capacity)
    {
        int newcapacity = (pst->capacity == 0) ? 4 : pst->capacity * 2;
        STDataType* temp = (STDataType*)realloc(pst->a, sizeof(STDataType) * newcapacity);
        if (temp == NULL)
        {
            perror("realloc");
            return;
        }
        pst->a = temp;
        pst->capacity = newcapacity;
    }
    pst->a[pst->top] = x;
    pst->top++;
}

//删除
void StackPop(ST* pst)
{
    assert(pst);
    assert(pst->top > 0);
    pst->top--;
}

//返回top值
STDataType StackTop(ST* pst)
{
    assert(pst);
    assert(pst->top > 0);
    return pst->a[pst->top - 1];
}

//判断是否为空
bool StackEmpty(ST* pst)
{
    assert(pst);
    return pst->top == 0;
}

//元素个数
int StackSize(ST* pst)
{
    assert(pst);
    return pst->top;
}


typedef struct {
    ST st1;
    ST st2;
} MyQueue;


MyQueue* myQueueCreate() {
    MyQueue* pq = (MyQueue*)malloc(sizeof(MyQueue));
    if (pq == NULL)
    {
        perror("malloc");
        return NULL;
    }
    StackInit(&pq->st1);
    StackInit(&pq->st2);
    return pq;
}

void myQueuePush(MyQueue* obj, int x) {
    if (!StackEmpty(&obj->st1))
    {
        StackPush(&obj->st1, x);
    }
    else
    {
        StackPush(&obj->st2, x);
    }
}

int myQueuePop(MyQueue* obj) {
    ST* emptys = &obj->st1;
    ST* nonemptys = &obj->st2;
    if (!StackEmpty(&obj->st1))
    {
        emptys = &obj->st2;
        nonemptys = &obj->st1;
    }
    while (StackSize(nonemptys) > 1)
    {
        StackPush(emptys, StackTop(nonemptys));
        StackPop(nonemptys);
    }
    int first = StackTop(nonemptys);
    StackPop(nonemptys);
     while (StackSize(emptys) > 0)
    {
        StackPush(nonemptys, StackTop(emptys));
        StackPop(emptys);
    }
    return first;
}

int myQueuePeek(MyQueue* obj) {
    ST* emptys = &obj->st1;
    ST* nonemptys = &obj->st2;
    if (!StackEmpty(&obj->st1))
    {
        emptys = &obj->st2;
        nonemptys = &obj->st1;
    }
    while (StackSize(nonemptys) > 1)
    {
        StackPush(emptys, StackTop(nonemptys));
        StackPop(nonemptys);
    }
    int first = StackTop(nonemptys);
    StackPush(emptys, StackTop(nonemptys));
    StackPop(nonemptys);
    while (StackSize(emptys) > 0)
    {
        StackPush(nonemptys, StackTop(emptys));
        StackPop(emptys);
    }
    return first;
}

bool myQueueEmpty(MyQueue* obj) {
    return StackEmpty(&obj->st1) && StackEmpty(&obj->st2);
}

void myQueueFree(MyQueue* obj) {
    StackDestroy(&obj->st1);
    StackDestroy(&obj->st2);
    free(obj);
}

225.用队列模拟实现栈  

225. 用队列实现栈 - 力扣(LeetCode)

        对于队列,我们也可以使用同样的思路,使用两个栈将数据来回导入导出,来实现队列的一端进行插入,另一端进行删除操作的定义。这里我们叫一个为emptyq(空队列),另一个叫nonemptys(非空队列)

        当我们想要插入时直接尾插到nonemptyq(如果是第一次插入,无所谓emptyq,nonemptyq)。

        当我们想要删除时,将nonemptyq中第二个及以上的数据导入emptyq中,再将nonemptyq中的第一个数据删除。

注:因为C语言,并没有对链式队列的实现,所以我们要自己定义一个链式队列。

typedef int QNDataType;

typedef struct QueueNode
{
	QNDataType data;
	struct QueueNode* next;
}QNode;

typedef struct Queue
{
	QNode* phead;
	QNode* ptail;
	int size;
}Queue;


//初始化
void QueueInit(Queue* pq)
{
	assert(pq);
	pq->phead = NULL;
	pq->ptail = NULL;
	pq->size = 0;
}

//插入
void QueuePush(Queue* pq, QNDataType x)
{
	assert(pq);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("mallloc");
		return;
	}
	newnode->data = x;
	newnode->next = NULL;
	if (pq->ptail == NULL)
	{
		pq->ptail = pq->phead = newnode;
	}
	else
	{
		pq->ptail->next = newnode;
		pq->ptail = newnode;
	}
	pq->size++;
}

//删除
void QueuePop(Queue* pq)
{
	assert(pq);
	assert(pq->phead);
	if (pq->phead->next == NULL)
	{
		pq->phead = pq->phead->next;
		pq->ptail = NULL;
	}
	else
	{
		QNode* del = pq->phead;
		pq->phead = pq->phead->next;
		free(del);
		del = NULL;
	}
	pq->size--;
}

//获取头部元素
QNDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(pq->phead);
	return pq->phead->data;
}

//获取尾部元素
QNDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(pq->phead);
	return pq->ptail->data;
}

//元素个数
int QueueSize(Queue* pq)
{
	assert(pq);
	QNode* cur = pq->phead;
	int size = 0;
	while (cur != NULL)
	{
		size++;
		cur = cur->next;
	}
	return size;
}

//判断是否为空 
bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->phead == NULL;
}

//销毁
void QueueDestroy(Queue* pq)
{
	assert(pq);
	while(!QueueEmpty(pq))
	{
		QueuePop(pq);
	}
	pq->size = 0;
}
typedef struct {
    Queue q1;
    Queue q2;
} MyStack;


MyStack* myStackCreate() {
    MyStack* pst = (MyStack*)malloc(sizeof(MyStack));
		QueueInit(&pst->q1);
		QueueInit(&pst->q2);

		return pst;
}

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* nonempty = &obj->q2;
		if(!QueueEmpty(&obj->q1))
		{
			empty = &obj->q2;
			nonempty = &obj->q1;
		}
		while(QueueSize(nonempty) > 1)
		{
			QueuePush(empty,QueueFront(nonempty));
			QueuePop(nonempty);
		}
		int top = QueueFront(nonempty);
		QueuePop(nonempty);
		return top;
}

int myStackTop(MyStack* obj) {
    if(!QueueEmpty(&obj->q1))
		{
			return obj->q1.ptail->data;
		}
		else{
			return obj->q2.ptail->data;
		}
}

bool myStackEmpty(MyStack* obj) {
    return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);
}

void myStackFree(MyStack* obj) {
    QueueDestroy(&obj->q1);
    QueueDestroy(&obj->q2);
		free(obj);
}

        如果你看到这里,如果对其中代码有疑问,或者有更好的实现,欢迎大家在评论区讨论交流,方便大家更好的学习。

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

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

相关文章

【LeetCode】每日一题 2023_11_14 阈值距离内邻居最少的城市(Floyd 最短路算法)

文章目录 刷题前唠嗑题目:阈值距离内邻居最少的城市题目描述代码与解题思路随机挑选一个大佬的题解 CV 结语 刷题前唠嗑 LeetCode? 启动!!! 今天的题目也是重量级,看到这个题目的名字,看到这张图&#xf…

MySQL My.cnf参数梳理与延伸 (MYSQL 8 cache and buffer类)

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,(…

Python兼职接单(非常详细)从零基础入门到精通,看完这一篇就够了

当下python需求量还是挺大的,对于想要做兼职的程序员还是挺友好的:起码不用愁找不到;目前来看,其兼职方向大致有三:开发、爬虫、数据分析。 就开发来说,目前python的轮子在Github上一抓一大把,…

数据结构笔记:R树

R-trees: a dynamic index structure for spatial searching 1984 1 介绍 R树可以看作B树再高维空间的扩展。它很好的解决了在高维空间搜索等问题。 采用了B树分割空间的思想,并在添加、删除操作时采用合并、分解结点的方法,保证树的平衡性R树就是一棵…

Nginx配置开启HTTPS

获取证书文件 Nginx 开启SSL server {listen 443 default ssl;server_name localhost;#charset koi8-r;#access_log logs/host.access.log main;proxy_set_header Host $host;ssl_certificate /usr/local/nginx/cert/server.pem;ssl_certificate_key /usr/local/ngin…

Sealos 云操作系统一键集成 runwasi,解锁 Wasm 的无限潜力

WebAssembly (通常缩写为 Wasm) 是一种为网络浏览器设计的低级编程语言。它旨在提供一种比传统的 JavaScript 更快、更高效的方式来执行代码,以弥补 JavaScript 在性能方面的不足。通过使用二进制格式,WebAssembly 能够提供比传统 JavaScript 更快的解析…

印刷企业使用数字工厂管理系统前后有什么变化

随着科技的飞速发展,数字工厂管理系统已经逐渐渗透到印刷企业的各个环节。本文将通过分析印刷企业在使用数字工厂管理系统前后的变化,探讨这一技术如何为印刷行业带来革新。 一、使用前的状况 在使用数字工厂管理系统之前,印刷企业的生产方式…

从理论到实践:深度解读BIO、NIO、AIO的优缺点及使用场景

文章目录 BIO优缺点示例代码 NIO优缺点示例代码 AIO优缺点示例代码 总结 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 BIO、NIO和AIO是Java编程语言中用于处理输入输出(IO…

一则DNS被重定向导致无法获取MySQL连接处理

同事反馈xwik应用端报java exception 获取MySQL连接超时无法连接到数据库实例 经过告警日志发现访问进来的IP地址数据库端无法被解析,这里可以知道问题出现在Dns配置上了 通过以上报错检查/etc/resolve.conf 发现namesever 被重定向设置成了114.114.114.114 域名 …

Java面试题(每天10题)-------连载(31)

多线程篇 注:今天只更新四题,明天就换别的了 1、concurrent包下有哪些类? ConcurrentHashMap、Future、FutureTask、AtomicInteger... 2、线程a、b、c、d运行任务,怎么保证当a、b、c线程执行完再执行d线程? 1 、 Cou…

AdaBoost:提升机器学习的力量

一、介绍 机器学习已成为现代技术的基石,为从推荐系统到自动驾驶汽车的一切提供动力。在众多机器学习算法中,AdaBoost(Adaptive Boosting的缩写)作为一种强大的集成方法脱颖而出,为该领域的成功做出了重大贡献。AdaBoo…

企业设备巡检的痛点和解决方案

在设备巡检过程中,企业常面临多种痛点。首先,信息管理不足是一个关键问题,企业往往缺乏全面、准确的设备信息记录,这导致巡检工作缺乏针对性和效率。其次,巡检流程的非标准化使得巡检结果出现不一致,重要的…

HTML5+CSS3小实例:炫酷的流边按钮

实例:炫酷的流边按钮 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content="wid…

妙手ERP本期功能优化:TikTok创建折扣活动可默认生成活动名称和时间、Shopee利润明细新增字段等

为了给卖家朋友带来更好的使用体验&#xff0c;更高效地运营跨境店铺&#xff0c;妙手ERP在上周优化了以下多项功能。 01、产品模块优化 全平台 - 批量编辑平台SKU增加翻译功能 TikTok - 创建折扣活动时&#xff0c;可默认生成活动名称和时间 02、订单模块优化 全平台 - 扫…

CleanMyMac X“断网激活”真的可以吗?

CleanMyMac X帮助Mac系统进行垃圾清理&#xff0c;清除多余的缓存、应用程序等&#xff0c;在提高工作效率上起了很大的作用。但是随着对软件的需求不断增加&#xff0c;很多人开始研究通过捷径破解正版软件&#xff0c;但是是否能成功呢&#xff1f;今天小编就为大家揭开“断网…

哪些方面的应用适合博捷芯双轴半自动划片机?

博捷芯BJX3666系列双轴半自动划片机可以应用于以下领域&#xff1a; 1. 集成电路制造&#xff1a;在集成电路制造中&#xff0c;划片机可以用来将芯片从晶圆上切割下来&#xff0c;以便进行封装和测试。此外&#xff0c;还可以用来对芯片进行划片分离加工&#xff0c;以得到所需…

格式工厂——万能格式转换器

很多时候&#xff0c;大家从网络上下载的文件不一定是自己想要的类型&#xff0c;比如flv等视频文件&#xff0c;而强行改文件后缀名只会造成文件格式错误&#xff0c;无法打开&#xff1b;而很多文件的格式并不能轻易转换&#xff0c;且很多渠道都需要收费。今天介绍的这款For…

【linux】centos7 yum安装nginx

查看系统中是否已安装 nginx 服务 yum list | grep nginx查看nginx运行进程 ps -ef | grep nginx添加源 rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm 安装Nginx yum install -y nginx 查看nginx安装目录 find …

【23真题】懒得出题!连续两年试卷相同!

连续两年出题一样&#xff0c;老师都懒得出题的院校又被我抓到一所&#xff01;&#xff08;上次是天津工业22和21年一模一样&#xff09;&#xff0c;这次沈阳工业的老师多多少少改了几个数&#xff0c;但是也大差不差&#xff0c;考这所院校&#xff0c;猛刷真题&#xff0c;…

Elasticsearch的配置学习笔记

文/朱季谦 Elasticsearch是一个基于Lucene的搜索服务器。它提供一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口&#xff0c;Elasticsearch是用Java语言开发的。 关于Elasticsearch系列笔记&#xff0c;主要从Elasticsearch的配置、核心组件、架构设计、使…