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

力扣(LeetCode) ——225 用队列实现栈(C语言)

题目:用队列实现栈

在这里插入图片描述

示例1:

输入:
[“MyStack”, “push”, “push”, “top”, “pop”, “empty”]
[[], [1], [2], [], [], []]

输出: [null, null, null, 2, 2, false]

解释:
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False

解题思路:

栈的特性是只能在一端插入和删除元素,但是队列是队头删除元素队尾插入元素。

在这里插入图片描述

最终代码:

typedef int QDataType;
//节点结构
typedef struct QueueNode
{QDataType val;struct QueueNode* next; 
}QNode;
//队列结构
typedef struct Queue
{QNode* phead;//队头QNode* ptail;//队尾int size;//队列大小
}Queue;//初始化
void QueueInit(Queue* pq)
{assert(pq);pq->phead = pq->ptail = NULL;pq->size = 0;
}//销毁
void QueueDestroy(Queue* pq)
{assert(pq);QNode* pcur = pq->phead;while (pcur){QNode* next = pcur->next;free(pcur);pcur = next;}pq->phead = pq->ptail = NULL;pq->size = 0;
}//队尾插入
void QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");return;}newnode->next = NULL;newnode->val = x;if (pq->ptail == NULL){pq->phead = pq->ptail = newnode;}else{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}//队头删除
void QueuePop(Queue* pq)
{assert(pq && pq->size > 0);if (pq->phead->next == NULL){free(pq->phead);pq->phead = pq->ptail = NULL;}else{QNode* next = pq->phead->next;free(pq->phead);pq->phead = next;}pq->size--;
}//取队头数据
QDataType QueueFront(Queue* pq)
{assert(pq && pq->size > 0);return pq->phead->val;
}//取队尾数据
QDataType QueueBack(Queue* pq)
{assert(pq && pq->ptail);return pq->ptail->val;
}//判断队列是否为空
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->size == 0;
}//队列个数
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}//————————————————————————————
typedef struct {Queue q1;Queue 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) 
{Queue* empty = &(obj->q1);Queue* nonEmpty = &(obj->q2);if(!QueueEmpty(&(obj->q1))){empty = &(obj->q2);nonEmpty = &(obj->q1);}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);obj = NULL;
}
http://www.xdnf.cn/news/17875.html

相关文章:

  • 算法基础 第3章 数据结构
  • C++类与对象核心知识点全解析(中)【六大默认成员函数详解】
  • P1281 [CERC1998] 书的复制
  • TCP 连接管理:深入分析四次握手与三次挥手
  • 2025年大模型安全岗的面试汇总(题目+回答)
  • 扩展用例-失败的嵌套
  • 大语言模型基础
  • 监控插件SkyWalking(二)集成方法
  • 7、C 语言数组进阶知识点总结
  • Mac 新电脑安装cocoapods报错ruby版本过低
  • 仪器制造业推广平台推荐有哪家
  • 计算机视觉(opencv)实战二——图像边界扩展cv2.copyMakeBorder()
  • K8S企业级应用与DaemonSet实战解析
  • 我们可以无损放大一个transformer吗
  • [vibe coding-lovable]lovable是不是ai界的复制忍者卡卡西?
  • 微美全息(WIMI.US)借区块链与聚类技术,开启物联网去中心化安全架构新纪元
  • Maven学习笔记
  • iOS Sqlite3
  • PDF 段落提取利器:Spring AI 的 ParagraphPdfDocumentReader 实战
  • docker 容器管理入门教程
  • 【科研绘图系列】R语言绘制微生物丰度和基因表达值的相关性网络图
  • 解剖HashMap的put <五> JDK1.8
  • 短视频流量|基于Java+vue的短视频流量数据分析系统(源码+数据库+文档)
  • Go语言实战案例:用Gin实现图书管理接口
  • 云原生俱乐部-k8s知识点归纳(1)
  • 当GitHub宕机时,我们如何协作?
  • Flutter sqflite插件
  • Docker运行python项目:使用Docker成功启动FastAPI应用
  • Java 中导出 Excel 文件的方法
  • 本地jar导入到本地仓科和远程仓库