用队列实现栈,用栈实现队列
有两个地方会讨论到栈一个是程序运行的栈空间一个是数据结构中的栈本文中讨论的是后者。栈是一个先入后出后入先出的数据结构只能操作栈顶。栈有两个操作push 和 poppush压栈pop出栈。栈还有一个操作 top这个操作可以查看栈顶的元素不会出栈。汉诺塔、摞起来的盘子、摞起来的书本就是现实中的栈。队列是一种先入先出后入后出的数据结构。队列也可以通过front来读取队列头pop来出队与栈类似。用队列实现栈每次都可以做转移用栈实现队列是条件转移之后pop栈是空的时候才可以转移。1 用队列实现栈leetcode 链接用队列实现栈用队列实现栈队列先入先出以及栈先入后出的语义不能改变。关键是怎么在压栈的时候将数据放到队列头这就需要两个队列进行配合。两个队列配合的方式有两种这两种方式均可以解答这个问题1入栈的时候进行元素移动① 两个队列始终保持一个队列是空的假设是队列 A压栈的时候将元素放入这个队列。这样最后入队的放到了队列头所以下次出栈的时候就是第一个出队的。满足先进后出后进先出的要求也就是栈的语义。② 然后将另一个队列(假设是队列 B)里边的元素都移动到这个队列中。这样元素都移动到了队列 A 中队列 B 成为了空队列。下一个元素入队的时候将元素入队到队列 B将元素 A 中的元素移动到 B 中。以此类推。每个元素入队的时候都做这个操作。第一个元素 10入队 AB 中没有元素不需要操作第二个元素 20入队 BA 中的 10 移动到 B第 3 个元素 30 入队 AB 中元素移动到 A2出栈的时候进行元素移动① 压栈的时候将元素入队到有元素的这个队列里边② 出栈的时候将元素移动到另一个队列中同时进行判断当队列剩余 1 个元素的时候这个元素就是出栈的元素不用移动到另一个队列中了。方法 1 的主要逻辑在 push函数中实现方法 2 的主要逻辑在 top和 pop 函数中都要实现。两个方法都可以通过两个队列来实现也可以通过一个队列也是可以实现的。1.1 入队时处理双队列class MyStack { public: MyStack() { } void push(int x) { if (q_master_.empty()) { q_master_.push(x); while (!q_slave_.empty()) { q_master_.push(q_slave_.front()); q_slave_.pop(); } } else { q_slave_.push(x); while (!q_master_.empty()) { q_slave_.push(q_master_.front()); q_master_.pop(); } } } int pop() { if (!q_master_.empty()) { int data q_master_.front(); q_master_.pop(); return data; } else { int data q_slave_.front(); q_slave_.pop(); return data; } } int top() { if (!q_master_.empty()) { return q_master_.front(); } else { return q_slave_.front(); } } bool empty() { return q_master_.empty() q_slave_.empty(); } private: std::queueint q_master_; std::queueint q_slave_; };1.2 入队时操作单队列关键是 push() 函数中的操作将元素入队之后然后将新元素之外的元素出队再重新入队。这样保证了新入队的元素移动到了队列头的位置下次出栈的时候直接出队就可以。class MyStack { public: MyStack() { } void push(int x) { q_.push(x); int size q_.size(); for (int i 0; i size - 1; i) { q_.push(q_.front()); q_.pop(); } } int pop() { int data q_.front(); q_.pop(); return data; } int top() { return q_.front(); } bool empty() { return q_.empty(); } private: std::queueint q_; };1.3 出队时操作双队列class MyStack { public: MyStack() { } void push(int x) { if (!q_master_.empty()) { q_master_.push(x); } else { q_slave_.push(x); } } int pop() { if (!q_master_.empty()) { int size q_master_.size(); for (int i 0; i size - 1; i) { q_slave_.push(q_master_.front()); q_master_.pop(); } int data q_master_.front(); q_master_.pop(); return data; } else { int size q_slave_.size(); for (int i 0; i size - 1; i) { q_master_.push(q_slave_.front()); q_slave_.pop(); } int data q_slave_.front(); q_slave_.pop(); return data; } } int top() { if (!q_master_.empty()) { int size q_master_.size(); for (int i 0; i size - 1; i) { q_slave_.push(q_master_.front()); q_master_.pop(); } int data q_master_.front(); q_master_.pop(); q_slave_.push(data); return data; } else { int size q_slave_.size(); for (int i 0; i size - 1; i) { q_master_.push(q_slave_.front()); q_slave_.pop(); } int data q_slave_.front(); q_slave_.pop(); q_master_.push(data); return data; } } bool empty() { return q_master_.empty() q_slave_.empty(); } private: std::queueint q_master_; std::queueint q_slave_; };1.4 出队时操作单队列class MyStack { public: MyStack() { } void push(int x) { q_.push(x); } int pop() { int size q_.size(); for (int i 0; i size - 1; i) { q_.push(q_.front()); q_.pop(); } int data q_.front(); q_.pop(); return data; } int top() { int size q_.size(); for (int i 0; i size - 1; i) { q_.push(q_.front()); q_.pop(); } int data q_.front(); q_.pop(); q_.push(data); return data; } bool empty() { return q_.empty(); } private: std::queueint q_; };2 用栈实现队列leetcode 链接用栈实现队列用栈实现队列需要在出队的时候进行操作。在入队的时候进行操作算法不好实现不像队列中的元素比如元素顺序是 E1、E2、E3、E4、E5那么元素在移动之后还是这样的顺序移动多次之后还是保持这样的顺序。但是对于栈来说每移动一次就会导致顺序翻转所以在入队的时候进行操作的算法不好实现。使用栈实现队列需要使用两个栈。只使用一个栈算法也不好实现。两个栈 A 和 B在入队的时候只往 A 压栈出队的时候只从 B 出栈。当 B 是空的时候那么将 A 中所有的元素都移动到 B。class MyQueue { public: MyQueue() { } void push(int x) { s_in_.push(x); } int pop() { if (s_out_.empty()) { while (!s_in_.empty()) { s_out_.push(s_in_.top()); s_in_.pop(); } } int ret s_out_.top(); s_out_.pop(); return ret; } int peek() { if (s_out_.empty()) { while (!s_in_.empty()) { s_out_.push(s_in_.top()); s_in_.pop(); } } return s_out_.top(); } bool empty() { return s_out_.empty() s_in_.empty(); } private: std::stackint s_in_; std::stackint s_out_; };3用栈判断括号表达式的合法性判断括号表达式的合法性是典型的使用栈的题目。([)]像这样的表达式虽然小括号和大括号都是成对出现的并且都是先出现的左括号后出现的右括号也不是合法的表达式。所以针对这个题目使用最基本的思路来判断是无法实现的无法处理括号交叉嵌套的情况。使用栈的特性一旦配对就把这一层的括号弹出来处理括号交叉嵌套的情况。templatetypename T class Stack { public: void push(T const element) { data_.push_back(element); } void pop() { data_.pop_back(); } T top() { return data_.back(); } bool empty() { return data_.size() 0; } int size() { return data_.size(); } private: std::vectorT data_; }; class Solution { public: bool isValid(string s) { Stackchar stack; for (char c : s) { switch (c) { case (: case [: case {: { stack.push(c); break; } case ):{ if (stack.empty()) { return false; } char tmp stack.top(); if (tmp () { stack.pop(); }else{ return false; } break; } case ]:{ if (stack.empty()) { return false; } char tmp stack.top(); if (tmp [) { stack.pop(); }else { return false; } break; } case }: { if (stack.empty()) { return false; } char tmp stack.top(); if (tmp {) { stack.pop(); }else { return false; } } default:{ break; } } } if (!stack.empty()) { return false; } return true; } };

相关新闻

PaddlePaddle Fluid v1.3深度学习框架核心升级解析

PaddlePaddle Fluid v1.3深度学习框架核心升级解析

1. Paddle Fluid v1.3版本的核心升级解析百度PaddlePaddle团队在2019年3月推出的Fluid v1.3版本,堪称深度学习框架发展史上的重要里程碑。作为国内首个自主研发的深度学习平台,这次更新在基础架构、训练效率和模型支持三个维度实现了突破性进展。我们团队…

2026/7/22 11:44:19阅读更多 →
.NET开发者学习Python:跨语言开发实战指南

.NET开发者学习Python:跨语言开发实战指南

1. 为什么.NET开发者需要学习Python作为一名长期深耕.NET生态的开发者,我最初对Python的态度是"不过是个脚本语言"。直到参与了一个跨语言项目后,才真正体会到Python在数据科学和快速原型开发中的独特优势。对于C#开发者而言,Pytho…

2026/7/20 21:02:47阅读更多 →
Python包管理新纪元:PDM如何彻底改变你的开发工作流

Python包管理新纪元:PDM如何彻底改变你的开发工作流

Python包管理新纪元:PDM如何彻底改变你的开发工作流 【免费下载链接】pdm A modern Python package and dependency manager supporting the latest PEP standards 项目地址: https://gitcode.com/GitHub_Trending/pd/pdm PDM(Python Development…

2026/7/22 10:23:03阅读更多 →
Alfred效率神器:从基础到高阶的macOS自动化指南

Alfred效率神器:从基础到高阶的macOS自动化指南

1. Alfred 效率神器入门指南作为 macOS 平台最强大的效率工具之一,Alfred 早已超越了简单的应用启动器角色。我使用 Alfred 近五年时间,从最初的基础搜索功能到如今深度定制的自动化工作流,它彻底改变了我的工作方式。不同于系统自带的 Spotl…

2026/7/22 21:07:47阅读更多 →
Hue全局配置文件hue.ini详解与最佳实践

Hue全局配置文件hue.ini详解与最佳实践

1. Hue全局配置文件概述Hue作为一款开源的SQL查询助手和数据仓库交互工具,其核心配置都存储在hue.ini文件中。这个配置文件采用INI格式,包含了Hue服务的所有可调参数,从基础网络设置到高级安全选项一应俱全。初次接触hue.ini时,最…

2026/7/22 21:07:47阅读更多 →
Rugby:终极CocoaPods缓存工具,让Xcode项目编译速度提升3倍!

Rugby:终极CocoaPods缓存工具,让Xcode项目编译速度提升3倍!

Rugby:终极CocoaPods缓存工具,让Xcode项目编译速度提升3倍! 【免费下载链接】Rugby 🏈 Cache CocoaPods for faster rebuild and indexing Xcode project. 项目地址: https://gitcode.com/gh_mirrors/ru/Rugby Rugby是一款…

2026/7/22 21:07:47阅读更多 →
2025年趋势预测:gh_mirrors/aw/awesome-instruction-datasets将如何引领下一代ChatLLM训练

2025年趋势预测:gh_mirrors/aw/awesome-instruction-datasets将如何引领下一代ChatLLM训练

2025年趋势预测:gh_mirrors/aw/awesome-instruction-datasets将如何引领下一代ChatLLM训练 【免费下载链接】awesome-instruction-datasets A collection of awesome-prompt-datasets, awesome-instruction-dataset, to train ChatLLM such as chatgpt 收录各种各样…

2026/7/22 21:07:47阅读更多 →
AgentSociety 2实验回放与分析:如何解读智能体行为数据

AgentSociety 2实验回放与分析:如何解读智能体行为数据

AgentSociety 2实验回放与分析:如何解读智能体行为数据 【免费下载链接】agentsociety AgentSociety 2 is a modern, LLM-native agent simulation platform designed for social science research and experimental design. It provides a flexible framework for …

2026/7/22 21:07:46阅读更多 →
Wine 与 Linux 内核的交互

Wine 与 Linux 内核的交互

Wine 不进内核,也不加载内核模块。Windows 程序以普通 Linux 用户态进程运行;Wine 在用户态把 Windows API / NT syscall 翻译成 Linux 系统调用,或交给 wineserver 做“假内核”对象管理。 总体路径 1. 直接系统调用(最常见&…

2026/7/22 21:05:46阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 0:53:59阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 0:53:59阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 0:53:59阅读更多 →
中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业做小程序,最常见的矛盾是预算有限,但又不希望功能太单薄;没有技术团队,但又希望后续能自己运营;想快速上线,又担心隐性收费和售后失联。选型时如果只看“低价套餐”或“案例数量”,很容…

2026/7/22 0:01:17阅读更多 →
GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

企业做营销,最怕钱花完了,资产没有留下。 效果广告能带来一段时间的曝光,但预算停止后,流量往往也随之停止。短视频内容可能在几天内冲高,也可能很快沉下去。AI搜索时代,企业需要重新思考一个问题&#xff…

2026/7/22 0:01:17阅读更多 →
Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复 一、你的 Agent 在"再想想"的循环里绕了 12 轮,用户已经关窗口了 Agent 与人最大的区别是:人知道什么时候该停下来给答案,Agent 会一直"想"下去。你给 Agent 接…

2026/7/22 0:01:17阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/21 22:53:50阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/22 18:55:50阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/22 18:55:50阅读更多 →