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

栈实现队列方法与优化

更简洁的栈实现队列

对于算法面试,我们需要简洁高效的代码。以下是专门为面试准备的简化版本:

极简实现

#include <stdio.h>
#include <stdbool.h>#define MAX_SIZE 100typedef struct {int in[MAX_SIZE], out[MAX_SIZE];int in_top, out_top;
} MyQueue;MyQueue* myQueueCreate() {MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));obj->in_top = obj->out_top = -1;return obj;
}void myQueuePush(MyQueue* obj, int x) {obj->in[++obj->in_top] = x;
}int myQueuePop(MyQueue* obj) {if (obj->out_top == -1) {while (obj->in_top != -1) {obj->out[++obj->out_top] = obj->in[obj->in_top--];}}return obj->out[obj->out_top--];
}int myQueuePeek(MyQueue* obj) {if (obj->out_top == -1) {while (obj->in_top != -1) {obj->out[++obj->out_top] = obj->in[obj->in_top--];}}return obj->out[obj->out_top];
}bool myQueueEmpty(MyQueue* obj) {return obj->in_top == -1 && obj->out_top == -1;
}void myQueueFree(MyQueue* obj) {free(obj);
}

超简洁版本(一行注释都不带)

typedef struct {int in[100], out[100];int in_top, out_top;
} MyQueue;MyQueue* myQueueCreate() {MyQueue* obj = malloc(sizeof(MyQueue));obj->in_top = obj->out_top = -1;return obj;
}void myQueuePush(MyQueue* obj, int x) {obj->in[++obj->in_top] = x;
}int myQueuePop(MyQueue* obj) {if (obj->out_top == -1) {while (obj->in_top != -1) {obj->out[++obj->out_top] = obj->in[obj->in_top--];}}return obj->out[obj->out_top--];
}int myQueuePeek(MyQueue* obj) {if (obj->out_top == -1) {while (obj->in_top != -1) {obj->out[++obj->out_top] = obj->in[obj->in_top--];}}return obj->out[obj->out_top];
}bool myQueueEmpty(MyQueue* obj) {return obj->in_top == -1 && obj->out_top == -1;
}void myQueueFree(MyQueue* obj) {free(obj);
}

面试时需要解释的关键点

  1. 核心思想:用两个栈,一个负责入队,一个负责出队
  2. 关键操作:当出队栈为空时,将入队栈的所有元素"倒"到出队栈
  3. 时间复杂度
    • Push: O(1)
    • Pop/Peek: 摊还O(1)(每个元素最多被移动一次)

面试回答模板

面试官问:“请用栈实现队列”

你可以这样回答

“我可以使用两个栈来实现队列。一个栈专门用于入队操作,另一个栈专门用于出队操作。当需要出队但出队栈为空时,我会将入队栈的所有元素转移到出队栈,这样出队栈的栈顶就是队列的头部元素。这种方法可以保证入队O(1)时间复杂度,出队和查看队首的摊还时间复杂度也是O(1)。”

完整测试代码(供练习用)

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>// 在这里插入上面的极简实现代码int main() {MyQueue* q = myQueueCreate();// 测试用例myQueuePush(q, 1);myQueuePush(q, 2);printf("%d\n", myQueuePeek(q)); // 1printf("%d\n", myQueuePop(q));  // 1printf("%d\n", myQueueEmpty(q)); // 0 (false)myQueueFree(q);return 0;
}

这种简洁版本在面试中足够使用,重点是要理解算法原理并能清晰解释。记住核心思想:两个栈,一个进一个出,需要时倒腾一下

http://www.dtcms.com/a/398995.html

相关文章:

  • 设计模式-建造者模式详解
  • 卫星产业全景图:从制造到应用的星辰大海
  • 青海西宁网站开发公司网站建设要哪些人?
  • (5)tauri 日志
  • 宿迁网站开发网站开发必备技能
  • 如何选择合适的服务器租用商?
  • 网站rar文件专业免费网站建设
  • MySQL在服务器和参数化方面的通用调优策略详解
  • PaddleOCR 本地部署与 MCP 服务调用指南(Mac Intel CPU)
  • 开源的自动化平台
  • python+django/flask哈利波特书影音互动科普网站
  • SRC-文件上传导致XSS
  • 襄阳做网站的用 net做网站
  • 中式建筑公司网站青岛装饰公司十强排名
  • CSS网页设计实战——车辆购物页面
  • PyTorch 神经网络模型构建与核心工具详解
  • PHP 线上环境 Composer 依赖包更新部署指南
  • SQLCipher数据库的引用、创建、打开
  • 【 设计模式 | 创建型模式 建造者模式 】
  • 飞虹网架建设官方网站网站建设类有哪些职位
  • 公司网站做地图地址wordpress 固态链接
  • 4.4 I2C写数据
  • 代码审计-PHP专题MVC开发文件差异对比法模版引擎SSTI注入RCE执行1day分析
  • 使用IOT-Tree消息流MQTT模块节点实现监测数据推送功能
  • 网站开发团队取什么名字好监测网站空白栏目
  • PyTorch 神经网络构建方法总结
  • 案例分享|当Scrum沦为“精致的”形式主义
  • 【Linux网络】UDP协议
  • 【GPT入门】第70课 ragflow简单入门
  • 做任务可以给钱的网站企业网站优化要多少钱