用队列实现栈(力扣第225题)

2024-04-20 07:44
文章标签 实现 力扣 队列 225

本文主要是介绍用队列实现栈(力扣第225题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


#include "stdio.h"
#include "stdbool.h"
#include "string.h"
#include "stdlib.h"
#include "assert.h"//初始化队列
typedef int QueueDataType;typedef struct queue {QueueDataType val;struct queue* next;
}Qnode;typedef struct Queue {Qnode* phead;//队头Qnode* ptail;//队尾int size;//队列中的有效数据
}Queue;//初始化队
void QueueInit(Queue* pq);//入队
void QueuePush(Queue* pq,QueueDataType x);//出队
void QueuePop(Queue* pq);//获取队首元素
QueueDataType QueueFront(Queue* pq);//获取队尾元素
QueueDataType QueueBack(Queue* pq);//获取队列有效个数
int QueueSize(Queue* pq);//判断队列是否为空,为空返回1,非空返回0
bool QueueEmpty(Queue* pq);//打印队列
void QueuePrint(Queue* pq);//销毁队列
void QueueDestory(Queue* pq);#define _CRT_SECURE_NO_WARNINGS 1//初始化队
void QueueInit(Queue* pq)
{assert(pq);pq->size=0;pq->phead=pq->ptail=NULL;
}//入队
void QueuePush(Queue* pq, QueueDataType x)
{assert(pq);assert(pq);Qnode* newnode = (Qnode*)malloc(sizeof(Qnode));if (newnode == NULL){printf("malloc fail\n");exit(-1);}pq->size++;newnode->val = x;newnode->next = NULL;if (pq->phead == NULL){pq->phead = pq->ptail = newnode;}else{pq->ptail->next = newnode;pq->ptail = newnode;}
}//出队
void QueuePop(Queue* pq) {assert(pq);Qnode* next = pq->phead->next;free(pq->phead);pq->size--;pq->phead = next;
}//获取队首元素
QueueDataType QueueFront(Queue* pq) {assert(pq);assert(pq->size > 0);assert(pq->phead);return pq->phead->val;
}//获取队尾元素
QueueDataType QueueBack(Queue* pq) {assert(pq);assert(pq->ptail);assert(pq->size > 0);return pq->ptail->val;
}//获取队列有效个数
int QueueSize(Queue* pq) {assert(pq);return pq->size;
}//判断队列是否为空,为空返回1,非空返回0
bool QueueEmpty(Queue* pq) {assert(pq);return pq->size == 0 ? 1 : 0;
}//打印队列
void QueuePrint(Queue* pq) {assert(pq);assert(pq->phead);while (!QueueEmpty(pq)){printf("%d\n", pq->phead->val);QueuePop(pq);}
}//销毁队列
void QueueDestory(Queue* pq) {assert(pq);Qnode* cur = pq->phead;while (cur) {Qnode* next = cur->next;free(cur);cur = next;}pq->phead = pq->ptail = NULL;
}typedef struct {Queue pq1;Queue pq2;} MyStack;MyStack* myStackCreate() {MyStack* ST=(MyStack*)malloc(sizeof(MyStack));QueueInit(&ST->pq1);QueueInit(&ST->pq2);return ST;
}void myStackPush(MyStack* obj, int x) {if(QueueEmpty(&obj->pq1)){QueuePush(&obj->pq2,x);}else{QueuePush(&obj->pq1,x);}
}int myStackPop(MyStack* obj) {if(QueueEmpty(&obj->pq1)){while((&obj->pq2)->phead!=(&obj->pq2)->ptail){QueuePush(&obj->pq1,QueueFront(&obj->pq2));QueuePop(&obj->pq2);}int vala=QueueFront(&obj->pq2);QueuePop(&obj->pq2);return vala;}if(QueueEmpty(&obj->pq2)){while((&obj->pq1)->phead!=(&obj->pq1)->ptail){QueuePush(&obj->pq2,QueueFront(&obj->pq1));QueuePop(&obj->pq1);}}int valb=QueueFront(&obj->pq1);QueuePop(&obj->pq1);return valb;
}int myStackTop(MyStack* obj) {if(QueueEmpty(&obj->pq1)){return (&obj->pq2)->ptail->val;}return (&obj->pq1)->ptail->val;
}bool myStackEmpty(MyStack* obj) {if(QueueEmpty(&obj->pq1)&&QueueEmpty(&obj->pq2)){return true;}return false;
}void myStackFree(MyStack* obj) {Qnode* cur1 = (&obj->pq1)->phead;while(cur1){Qnode* next=cur1->next;free(cur1);cur1=next;}(&obj->pq1)->phead=(&obj->pq1)->ptail=NULL;Qnode* cur2 = (&obj->pq2)->phead;while(cur2){Qnode* next=cur2->next;free(cur2);cur2=next;}(&obj->pq2)->phead=(&obj->pq2)->ptail=NULL;(&obj->pq2)->phead=(&obj->pq2)->ptail=NULL;free(obj);obj=NULL;
}/*** Your MyStack struct will be instantiated and called as such:* MyStack* obj = myStackCreate();* myStackPush(obj, x);* int param_2 = myStackPop(obj);* int param_3 = myStackTop(obj);* bool param_4 = myStackEmpty(obj);* myStackFree(obj);
*/

 

这篇关于用队列实现栈(力扣第225题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Python实现PDF按页分割的技术指南

《Python实现PDF按页分割的技术指南》PDF文件处理是日常工作中的常见需求,特别是当我们需要将大型PDF文档拆分为多个部分时,下面我们就来看看如何使用Python创建一个灵活的PDF分割工具吧... 目录需求分析技术方案工具选择安装依赖完整代码实现使用说明基本用法示例命令输出示例技术亮点实际应用场景扩

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

如何在Java Spring实现异步执行(详细篇)

《如何在JavaSpring实现异步执行(详细篇)》Spring框架通过@Async、Executor等实现异步执行,提升系统性能与响应速度,支持自定义线程池管理并发,本文给大家介绍如何在Sprin... 目录前言1. 使用 @Async 实现异步执行1.1 启用异步执行支持1.2 创建异步方法1.3 调用

Spring Boot配置和使用两个数据源的实现步骤

《SpringBoot配置和使用两个数据源的实现步骤》本文详解SpringBoot配置双数据源方法,包含配置文件设置、Bean创建、事务管理器配置及@Qualifier注解使用,强调主数据源标记、代... 目录Spring Boot配置和使用两个数据源技术背景实现步骤1. 配置数据源信息2. 创建数据源Be

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

linux批量替换文件内容的实现方式

《linux批量替换文件内容的实现方式》本文总结了Linux中批量替换文件内容的几种方法,包括使用sed替换文件夹内所有文件、单个文件内容及逐行字符串,强调使用反引号和绝对路径,并分享个人经验供参考... 目录一、linux批量替换文件内容 二、替换文件内所有匹配的字符串 三、替换每一行中全部str1为st