当前位置: 首页 > news >正文

[LeetCode]-225. 用队列实现栈

目录

225. 用队列实现栈

题目

​思路

代码


225. 用队列实现栈

225. 用队列实现栈 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/implement-stack-using-queues/description/

题目

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppop 和 empty)。

实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

示例:

思路

两个队列,一个用来倒数据,一个用来删除数据

入队列时,入不为空的队列。出队列时,不为空队列的前N-1个数据倒入空队列中,剩下的就在队头,方便删除。

图示:

代码

//链式结构:表示队列
typedef int QDataType;
typedef struct QueueNode
{struct QueueNode* next;QDataType data;
}QNode;//队列的结构
typedef struct Queue
{QNode* head;QNode* tail;int size;
}Que;
//初始化队列
void QueueInit(Que* pq);
//销毁队列
void QueueDestroy(Que* pq);
//队尾入队列
void QueuePush(Que* pq, QDataType x);
//队头出队列
void QueuePop(Que* pq);
//获取队列队头元素
QDataType QueueFront(Que* pq);
//获取队列队尾元素
QDataType QueueBack(Que* pq);
//检测队列是否为空,如果为空返回非零结果,如果非空返回0
bool QueueEmpty(Que* pq);
//检测队列中有效元素个数
int QueueSize(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)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");exit(-1);}newnode->data = x;newnode->next = NULL;if (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(!QueueEmpty(pq));if (pq->head->next == NULL){free(pq->head);pq->head = pq->tail = NULL;}else{QNode* next = pq->head->next;free(pq->head);pq->head = next;}pq->size--;
}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;
}bool QueueEmpty(Que* pq)
{assert(pq);return pq->head == NULL;
}int QueueSize(Que* pq)
{assert(pq);return pq->size;
}typedef struct {Que q1;Que 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) {Que* empty=&obj->q1;Que* nonEmpty=&obj->q2;if(!QueueEmpty(&obj->q1)){nonEmpty=&obj->q1;empty=&obj->q2;}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 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);
}

相关文章:

  • 前端缓存机制——强缓存、弱缓存、启发式缓存
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • 前端Vue 页面滑动监听 拿到滑动的坐标值
  • 移除元素(双指针)
  • 目标检测回归损失函数(看情况补...)
  • 接收表单数据
  • HTTP 协议详解-上(Fiddler 抓包演示)
  • 【Redis】Redis与SSM整合Redis注解式缓存Redis解决缓存问题
  • android手机平板拓展电脑屏幕
  • 删数问题 (贪心)
  • 【星海出品】flask (四) 三方工具使用
  • 2.3 矩阵消元
  • 数据结构——时间复杂度和空间复杂度
  • Go并发编程(上)
  • PLC开放式以太网通信网络状态查看工具netstat
  • 【剑指offer】让抽象问题具体化
  • Git的一些常用操作
  • Java IO学习笔记一
  • javascript 总结(常用工具类的封装)
  • JavaScript-Array类型
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • Linux中的硬链接与软链接
  • MySQL几个简单SQL的优化
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Rancher-k8s加速安装文档
  • SQLServer之创建显式事务
  • Vue实战(四)登录/注册页的实现
  • 包装类对象
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 聊一聊前端的监控
  • 前嗅ForeSpider中数据浏览界面介绍
  • 原生js练习题---第五课
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • Semaphore
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​io --- 处理流的核心工具​
  • ​如何防止网络攻击?
  • $(function(){})与(function($){....})(jQuery)的区别
  • (2)Java 简介
  • (8)STL算法之替换
  • (C语言)fgets与fputs函数详解
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (规划)24届春招和25届暑假实习路线准备规划
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (九)信息融合方式简介
  • (五)关系数据库标准语言SQL
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)scrum常见工具列表
  • **PHP分步表单提交思路(分页表单提交)
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .net core 6 集成和使用 mongodb
  • .net 设置默认首页
  • .net 使用ajax控件后如何调用前端脚本
  • .Net(C#)常用转换byte转uint32、byte转float等