1.用队列实现栈 

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

typedef int QDatatype;
typedef struct QueueNode
{struct QueueNode *next;QDatatype data;
}QNode;typedef struct Queue
{QNode* head;QNode* tail;QDatatype size;
}Que;typedef struct 
{Que q1;Que q2;
} MyStack;void QueueInit(Que* pq);
void QueueDestroy(Que* pq);void QueuePush(Que* pq, QDatatype x);
void QueuePop(Que* pq);
int QueueSize(Que* pq);
bool QueueEmpty(Que* pq);QDatatype QueueFront(Que* pq);//队头数据
QDatatype QueueBack(Que* pq);//队尾数据void QueueInit(Que* pq)
{assert(pq);pq->head = pq->tail = NULL;pq->size = 0;
}void QueueDestroy(Que* pq)
{assert(pq);QNode* cur = pq->head;while (cur){QNode* next = cur->next;free(cur);cur = next;}pq->head = pq->tail = NULL;pq->size = 0;
}void QueuePush(Que* pq, QDatatype x)
{QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode==NULL){perror("malloc fail");return;}newnode->data = x;newnode->next = NULL;if (pq->head == NULL){assert(pq->tail == NULL);pq->head = pq->tail = newnode;}else{pq->tail->next = newnode;pq->tail = newnode;}pq->size++;
}void QueuePop(Que* pq)
{assert(pq);assert(pq->head != NULL);QNode* oldhead = pq->head;pq->head = pq->head->next;free(oldhead);if (pq->head == NULL){pq->tail = NULL;}pq->size--;
}int QueueSize(Que* pq)
{assert(pq);return pq->size;
}bool QueueEmpty(Que* pq)
{assert(pq);return pq->size == 0;
}QDatatype QueueFront(Que* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->head->data;
}QDatatype QueueBack(Que* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->tail->data;
}MyStack* myStackCreate() 
{MyStack*pst=(MyStack*)malloc(sizeof(MyStack));if(pst==NULL){perror("malloc fail");return NULL;}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) 
{assert(obj != NULL);Que* emptyQ = NULL;Que* noneemptyQ = NULL;// 确定哪个队列是非空的if (!QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2)) {noneemptyQ = &obj->q1;emptyQ = &obj->q2;} else if (QueueEmpty(&obj->q1) && !QueueEmpty(&obj->q2)) {noneemptyQ = &obj->q2;emptyQ = &obj->q1;} else {// 两个队列都为空,栈为空return -1; }// 将非空队列的元素(除最后一个外)移到空队列while (QueueSize(noneemptyQ) > 1) {QueuePush(emptyQ, QueueFront(noneemptyQ));QueuePop(noneemptyQ);}// 最后一个元素是栈顶int top = QueueFront(noneemptyQ);QueuePop(noneemptyQ);return top;
}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);
}

2.用栈实现队列 

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

typedef int STDataType;typedef struct Stack
{int* a;int top;int capacity;
}ST;typedef struct
{ST Popst;ST Pushst;
} MyQueue;void STInit(ST* ps);
void STDestroy(ST* ps);void STPush(ST* ps,STDataType x);
void STPop(ST* ps);
int STSize(ST* ps);
bool STEmpty(ST* ps);STDataType STTop(ST* ps);void STInit(ST* ps)
{assert(ps);ps->a = (STDataType*)malloc(sizeof(STDataType) * 4);if (ps->a == NULL){perror("malloc fail");return;}ps->capacity = 4;ps->top = 0;//top是栈顶元素的下一位置}void STDestroy(ST* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->capacity = 0;ps->top = 0;
}void STPush(ST* ps, STDataType x)
{assert(ps);if (ps->top == ps->capacity){STDataType*tmp = (STDataType*)realloc(ps->a,sizeof(STDataType) * ps->capacity*2);if (tmp == NULL){perror("malloc fail");return;}ps->a = tmp;ps->capacity *= 2;}ps->a[ps->top] = x;ps->top++;
}void STPop(ST* ps)
{assert(ps);assert(!STEmpty(ps));ps->top--;
}int STSize(ST* ps)
{assert(ps);return ps->top;
}
bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}STDataType STTop(ST* ps)
{assert(ps);assert(!STEmpty(ps));return ps->a[ps->top - 1];
}MyQueue* myQueueCreate() 
{MyQueue*obj=(MyQueue*)malloc(sizeof(MyQueue));if(obj==NULL){perror("malloc fail");return NULL;}STInit(&obj->Pushst);STInit(&obj->Popst);return obj;
}void myQueuePush(MyQueue* obj, int x) 
{STPush(&obj->Pushst,x);
}int myQueuePeek(MyQueue* obj) 
{if(STEmpty(&obj->Popst)){while(!STEmpty(&obj->Pushst)){STPush(&obj->Popst,STTop(&obj->Pushst));STPop(&obj->Pushst);}}return STTop(&obj->Popst);
}int myQueuePop(MyQueue* obj) 
{int front=myQueuePeek(obj);STPop(&obj->Popst);return front;
}bool myQueueEmpty(MyQueue* obj) 
{return(STEmpty(&obj->Pushst)&&STEmpty(&obj->Popst));
}void myQueueFree(MyQueue* obj) 
{STDestroy(&obj->Pushst);STDestroy(&obj->Popst);free(obj);
}

3.设计循环队列

622. 设计循环队列 - 力扣(LeetCode)

typedef struct {int*a;int k;int front;int rear;
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue*obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj->front=obj->rear=0;obj->a=(int*)malloc(sizeof(int)*(k+1));obj->k=k;return obj;
}bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->front==obj->rear;
}bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj->rear+1)%(obj->k+1)==obj->front;
}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(myCircularQueueIsFull(obj))return false;obj->a[obj->rear++]=value;obj->rear%=(obj->k+1);return true;
}bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return false;++obj->front;obj->front%=(obj->k+1);return true;
}int myCircularQueueFront(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;elsereturn obj->a[obj->front];
}int myCircularQueueRear(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;elsereturn obj->a[(obj->rear-1+obj->k+1)%(obj->k+1)];
}void myCircularQueueFree(MyCircularQueue* obj) {free(obj->a);free(obj);
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW二维码实时识别

​LabVIEW通过机器视觉技术,集成适配硬件构建二维码实时识别系统。通过图像采集、预处理、定位及识别全流程自动化,解决复杂环境下二维码识别效率低、准确率不足问题,满足工业产线追溯、物流分拣等实时识别需求。应用场景适用于工业产线追溯&…

微服务-springcloud-springboot-Skywalking详解(下载安装)

一、SkyWalking核心介绍 1. 什么是SkyWalking? Apache SkyWalking是一款国人主导开发的开源APM(应用性能管理)系统,2015年由吴晟创建,2017年进入Apache孵化器,2019年毕业成为Apache顶级项目。它通过分布式…

Elasticsearch 字段值过长导致索引报错问题排查与解决经验总结

在最近使用 Elasticsearch 的过程中,我遇到了一个 字段值过长导致索引失败 的问题。经过排查和多次尝试,最终通过设置字段 "index": false 方式解决。本文将从问题现象、排查过程、问题分析、解决方案和建议等方面,详细记录这次踩坑…

使用idea 将一个git分支的部分记录合并到git另一个分支

场景: 有多个版本分支,需要将其中一个分支的某一两次提交合并到指定分支上 eg: 将v1.0.0分支中指定提交记录 合并到 v1.0.1分支中 操作: 步骤一 idea切换项目分支到v1.0.1(需要合并到哪个分支就先站到哪个分支上) 步骤二 在ide…

基于深度学习的图像分类:使用ShuffleNet实现高效分类

前言 图像分类是计算机视觉领域中的一个基础任务,其目标是将输入的图像分配到预定义的类别中。近年来,深度学习技术,尤其是卷积神经网络(CNN),在图像分类任务中取得了显著的进展。ShuffleNet是一种轻量级的…

OpenGL里相机的运动控制

相机的核心构造一个是glm::lookAt函数,一个是glm::perspective函数,本文相机的一切运动都在于如何构建相应的参数传入上述两个函数里。glm::mat4 glm::lookAt(glm::vec3 const &eye,//相机所在位置glm::vec3 const &center,//要凝视的点glm::vec…

java设计模式 -【策略模式】

策略模式定义 策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。它将算法封装成独立的类,使得它们可以相互替换,而不影响客户端代码。 核心组成 Context(上下文)&…

项目重新发布更新缓存问题,Nginx清除缓存更新网页

server {listen 80;server_name your.domain.com; # 替换为你的域名root /usr/share/nginx/html; # 替换为你的项目根目录# 规则1:HTML 文件 - 永不缓存# 这是最关键的一步,确保浏览器总是获取最新的入口文件。location /index.html {add_header Cache-…

系统架构师:系统安全与分析-思维导图

系统安全与分析的定义​​系统安全与分析是系统架构师在系统全生命周期中贯穿的核心职责,其本质是通过​​识别、评估、防控安全风险,并基于数据与威胁情报进行动态分析​​,构建从技术到管理的多层次防护体系,确保系统的保密性&a…

利用 Google Guava 的令牌桶限流实现数据处理限流控制

目录 一、令牌桶限流机制原理 二、场景设计与目标 三、核心实现代码(Java) 1. 完整代码实现 四、运行效果分析 五、应用建议 在高吞吐数据处理场景中,如何限制数据处理速率、保护系统资源、防止下游服务过载是系统设计中重要的环节。本文…

小黑课堂计算机二级 WPS Office题库安装包2.52_Win中文_计算机二级考试_安装教程

软件下载 【名称】:小黑课堂计算机二级 WPS Office题库安装包2.52 【大小】:584M 【语言】:简体中文 【安装环境】:Win10/Win11(其他系统不清楚) 【迅雷网盘下载链接】(务必手机注册&#…

CSS3知识补充

1.伪类和伪元素: 简单的伪类实例 :first-chlid :last-child :only-child :invalid 用户行为伪类 :hover——上面提到过,只会在用户将指针挪到元素上的时候才会激活,一般就是链接元素。:focus——只会在用户使用键盘控制,选…

Spring Retry 异常重试机制:从入门到生产实践

Spring Retry 异常重试机制&#xff1a;从入门到生产实践 适用版本&#xff1a;Spring Boot 3.x spring-retry 2.x 本文覆盖 注解声明式、RetryTemplate 编程式、监听器、最佳实践 与 避坑清单&#xff0c;可直接落地生产。 一、核心坐标 <!-- Spring Boot Starter 已经帮…

VTK交互——CallData

0. 概要 这段代码https://examples.vtk.org/site/Cxx/Interaction/CallData/是一个使用VTK(Visualization Toolkit)库的示例程序,主要演示了自定义事件、回调函数和定时器的使用。程序创建一个旋转球体场景,并通过定时器触发自定义事件来更新计数器。以下是详细解释: 1.…

OCR工具集下载与保姆级安装教程!!

软件下载 软件名称&#xff1a;OCR工具集1.1 软件语言&#xff1a;简体中文 软件大小&#xff1a;78.8M 系统要求&#xff1a;Windows7或更高&#xff0c; 32/64位操作系统 硬件要求&#xff1a;CPU2GHz &#xff0c;RAM4G或更高 盘丨下载&#xff1a;https://tool.nineya…

平时遇到的错误码及场景?404?400?502?都是什么场景下什么含义,该怎么做 ?

✅ 一、常见 HTTP 错误码及含义状态码含义简述类型400Bad Request&#xff1a;请求格式有误客户端错误401Unauthorized&#xff1a;未授权客户端错误403Forbidden&#xff1a;禁止访问客户端错误404Not Found&#xff1a;资源不存在客户端错误405Method Not Allowed&#xff1a…

基于Tornado的WebSocket实时聊天系统:从零到一构建与解析

引言 在当今互联网应用中&#xff0c;实时通信已成为不可或缺的一部分。无论是社交媒体、在线游戏还是协同办公&#xff0c;用户都期待即时、流畅的交互体验。传统的HTTP协议是无状态的、单向的请求-响应模式&#xff0c;客户端发起请求&#xff0c;服务器返回响应&#xff0c…

【语义分割】记录2:yolo系列

图像分割笔记1、源码下载2、数据获取3、环境配置4、模型训练5、模型推理6、模型部署6.1 yolov5_flask学习7、版本上传1、源码下载 git clone https://github.com/ultralytics/ultralytics.gitgit回到对应版本&#xff1a; 方式一&#xff1a;使用 git checkout&#xff08;临…

ubuntu22.04系统 算力4090服务器 病毒防护 查杀等 运维入门(三)clamAV工具离线查杀

以下有免费的4090云主机提供ubuntu22.04系统的其他入门实践操作 地址&#xff1a;星宇科技 | GPU服务器 高性能云主机 云服务器-登录 相关兑换码星宇社区---4090算力卡免费体验、共享开发社区-CSDN博客 兑换码要是过期了&#xff0c;可以私信我获取最新兑换码&#xff01;&a…

微信小程序文件下载与预览功能实现详解

在微信小程序开发中&#xff0c;文件处理是常见需求&#xff0c;尤其是涉及合同、文档等场景。本文将通过一个实际案例&#xff0c;详细讲解如何实现文件的下载、解压、列表展示及预览功能。 功能概述 该页面主要实现了以下核心功能&#xff1a; 列表展示可下载的文件信息支持 …