当前位置: 首页 > 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.xdnf.cn/news/788905.html

相关文章:

  • 【复习】软件测试
  • 解决CSDN等网站访问不了的问题
  • 力扣HOT100之多维动态规划:5. 最长回文子串
  • 什么是AI芯片?
  • 龙虎榜——20250603
  • SAP局部数据类型是什么 数据类型的概念
  • 复杂系统仿真的具体意义
  • SOC-ESP32S3部分:27-设备OTA
  • 2025年AIR SCI1区TOP,多策略增强蜣螂算法MDBO+实际工程问题,深度解析+性能实测
  • 打卡第35天:GPU训练以及类的Call方法
  • 灵光一现的问题和常见错误4
  • 区块链确认时间
  • LangChain基本概念
  • Java对象比较与排序的常见错误及解决方案
  • C语言函数的声明和定义
  • Vue-Cropper:全面掌握图片裁剪组件
  • 物联网数据归档之数据存储方案选择分析
  • 【leetcode-两数之和】
  • 登高架设作业实操考试需要注意哪些安全细节?
  • 如何进行页面前端监控
  • 第十二节:第七部分:集合框架:Collection集合的使用总结、集合的并发修改异常问题
  • 计算机图形学 - 投影变换推导
  • qwen大模型在进行词嵌入向量时,针对的词表中的唯一数字还是其他的?
  • NX890NX894美光固态闪存NX906NX908
  • 6级阅读学习
  • 九(5).引用和指针的区别
  • 关于 java:6. 反射机制
  • 倚光科技:Zernike自由曲面转菲涅尔,反射镜及透镜加工技术革新
  • 2023年12月四级真题Reading Comprehension的分析总结
  • Day11