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

力扣刷题 -- 225. 用队列实现栈

1. 题目

 2. 思路分析

思路:1)往非空队列里插入数据(入队列);

2)将非空队列的前size-1个元素挪到空队列;

3)将非空队列的队尾元素出队列,并返回栈顶元素。

3. 代码实现 

typedef int QDataType;
typedef struct QueueNode {QDataType data;struct QueueNode* next;
} QueueNode;typedef struct Queue {QueueNode* phead;QueueNode* ptail;int size;
} Queue;// 初始化
void QueueInit(Queue* pq) {assert(pq);pq->phead = pq->ptail = NULL;pq->size = 0;
}
// 销毁
void QueueDestory(Queue* pq) {assert(pq);QueueNode* pcur = pq->phead;while (pcur) {QueueNode* next = pcur->next;free(pcur);// pcur = NULL;pcur = next;}pq->phead = pq->ptail = NULL;pq->size = 0;
}
// 队列判空
bool QueueEmpty(Queue* pq) {assert(pq);return pq->phead == NULL;
}
// 入队列
void QueuePush(Queue* pq, QDataType x) {assert(pq);// 申请新的结点QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));if (newnode == NULL) {perror("malloc fail!\n");exit(1);}newnode->data = x;newnode->next = NULL;// 空队列if (pq->phead == NULL) {pq->phead = pq->ptail = newnode;} else {pq->ptail->next = newnode;pq->ptail = pq->ptail->next;}pq->size++;
}
// 队列有效元素个数
int QueueSize(Queue* pq) {assert(pq);// QueueNode* pcur = pq->phead;// int size = 0;// while (pcur)//{//	pcur = pcur->next;//	size++;// }// return size;return pq->size;
}
// 出队列
void QueuePop(Queue* pq) {assert(pq);assert(!QueueEmpty(pq));// 只有一个结点时if (pq->phead == pq->ptail) {free(pq->phead);pq->phead = pq->ptail = NULL;} else {QueueNode* next = pq->phead->next;free(pq->phead);pq->phead = next;}pq->size--;
}
// 取队头元素
QDataType QueueFront(Queue* pq) {assert(pq);assert(!QueueEmpty(pq));return pq->phead->data;
}
// 取队尾元素
QDataType QueueBack(Queue* pq) {assert(pq);assert(!QueueEmpty(pq));return pq->ptail->data;
}
//这里是队列结构和相关方法/typedef struct {Queue q1;Queue q2;
} MyStack;MyStack* myStackCreate() {MyStack* pa=(MyStack*)malloc(sizeof(MyStack));QueueInit(&pa->q1);QueueInit(&pa->q2);return pa;
}
//将元素 x 压入栈顶
void myStackPush(MyStack* obj, int x) {//往非空队列插入数据--判空if(QueueEmpty(&obj->q1)){QueuePush(&obj->q2,x);}else{QueuePush(&obj->q1,x);}
}
//移除并返回栈顶元素
int myStackPop(MyStack* obj) {Queue* emp=&obj->q1;Queue* noemp=&obj->q2;if(QueueEmpty(&obj->q2)){noemp=&obj->q1;emp=&obj->q2;}while(QueueSize(noemp)>1){QueuePush(emp,QueueFront(noemp));QueuePop(noemp);}int top=QueueFront(noemp);QueuePop(noemp);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) {QueueDestory(&obj->q1);QueueDestory(&obj->q2);free(obj);obj=NULL;
}

http://www.lqws.cn/news/92089.html

相关文章:

  • Spring 中创建 Bean 有几种方式?
  • 深入理解Android进程间通信机制
  • 秋招Day12 - 计算机网络 - IP
  • 蓝桥杯 k倍区间
  • docker创建postgreSql带多个init的sql
  • openharmony5.0.0中kernel子系统编译构建流程概览(rk3568)
  • Dockerfile 使用多阶段构建(build 阶段 → release 阶段)前端配置
  • 5.Nginx+Tomcat负载均衡群集
  • PyTorch——非线性激活(5)
  • Docker 插件生态:从网络插件到存储插件的扩展能力解析
  • SQL Indexes(索引)
  • 安全大模型的思考
  • JVM-内存结构
  • Flink 失败重试策略 :restart-strategy.type
  • React 第五十一节 Router中useOutletContext的使用详解及注意事项
  • NVIDIA DOCA 3.0:引领AI基础设施革命的引擎简析
  • 【Elasticsearch】search_after不支持随机到哪一页,只能用于上一页或下一页的场景
  • RAG优化知识库检索(5):多阶段检索与重排序
  • 苹果Mac系统如何彻底清理vscode插件Augment
  • 互联网大厂智能体平台体验笔记字节扣子罗盘、阿里云百炼、百度千帆 、腾讯元器、TI-ONE平台、云智能体开发平台
  • GLIDE论文阅读笔记与DDPM(Diffusion model)的原理推导
  • [特殊字符] Unity 性能优化终极指南 — Text / TextMeshPro 组件篇
  • 车载软件架构 --- 软件定义汽车开发模式思考
  • ABAP设计模式之---“高内聚,低耦合(High Cohesion Low Coupling)”
  • Java垃圾回收机制深度解析:从理论到实践的全方位指南
  • 项目课题——基于ESP32的智能插座
  • iOS 应用如何防止源码与资源被轻易还原?多维度混淆策略与实战工具盘点(含 Ipa Guard)
  • 云服务器部署Gin+gorm 项目 demo
  • Mac版本Android Studio配置LeetCode插件
  • 基于InternLM的情感调节大师FunGPT