剑指offer 栈和队列 持续更新中...

ops/2025/2/6 20:32:25/

文章目录

  • 1. 用两个栈实现队列
    • 1.1 题目描述
    • 1.2 解法
  • 2. 用队列实现栈
    • 2.1 题目描述
    • 2.2 方法1,直接模拟
    • 2.3 方法2
    • 2.3 方法3,一个队列

1. 用两个栈实现队列

232. 用栈实现队列 - 力扣(LeetCode)

1.1 题目描述

题目描述:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):

示例 1:

输入:
["MyQueue", "push", "push", "peek", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 1, 1, false]
解释:
MyQueue myQueue = new MyQueue();
myQueue.push(1); 	// queue is: [1]
myQueue.push(2); 	// queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); 	// return 1
myQueue.pop(); 		// return 1, queue is [2]
myQueue.empty(); 	// return false

1.2 解法

使用两个栈,一个用来接收值(_s1),一个用来输出值(_s2),当_s2为空时,将_s1的值移动到_s2

class MyQueue 
{stack<int> _s1, _s2;// 将_s1的值移动到_s2中void moveS1ToS2(){while(!_s1.empty()) {_s2.push(_s1.top());_s1.pop();}}   
public:MyQueue() { }void push(int x) {_s1.push(x);}int pop() {if(empty())         return -1;if(_s2.empty())     moveS1ToS2();int top = _s2.top();_s2.pop();return top;}int peek() {if(empty())         return -1;if(_s2.empty())     moveS1ToS2();return _s2.top();}bool empty() {return _s1.empty() && _s2.empty();}
};

2. 用队列实现栈

225. 用队列实现栈 - 力扣(LeetCode)

2.1 题目描述

题目描述:请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppopempty)。

示例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

2.2 方法1,直接模拟

两个队列,一个用来入数据(q1),一个用来出数据(q2),与用栈实现队列的思路类似

class MyStack 
{queue<int> q1, q2;// 将q1的队列中的值移动到另q2中, 只剩一个void moveQ1(){while(q1.size() > 1) {q2.push(q1.front());q1.pop();}}
public:MyStack() {}void push(int x) {q1.push(x);}int pop() {if(empty())     return false;moveQ1();int ret = q1.front();q1.pop();swap(q1, q2);return ret;}int top() {if(empty())     return false;moveQ1();int ret = q1.front();q2.push(ret);q1.pop();swap(q1, q2);return ret;}bool empty() {return q1.empty() && q2.empty();}
};

2.3 方法2

精简一下方法1,但仍然使用两个队列,一个用来暂时存储存储加入的数据(q2),一个用来输出(q1),且q1使用pop()出来的元素的顺序是栈出元素的顺序,这是在push()数据时将q2的值移动到q1导致的。

class MyStack 
{queue<int> q1, q2;
public:MyStack() {}void push(int x) {q2.push(x);while(!q1.empty()) {q2.push(q1.front());q1.pop();}swap(q1, q2);}int pop() {int ret = q1.front();q1.pop();return ret;}int top() {return q1.front();}bool empty() {return q1.empty();}
};

2.3 方法3,一个队列

注意到q2完全可以不用

class MyStack 
{queue<int> q1;
public:MyStack() {}void push(int x) {int sz = q1.size();q1.push(x);for(int i=0; i<sz; ++i) {int tmp = q1.front();q1.pop();q1.push(tmp);}}int pop() {int ret = q1.front();q1.pop();return ret;}int top() {return q1.front();}bool empty() {return q1.empty();}
};

http://www.ppmy.cn/ops/156239.html

相关文章

云计算部署模式全面解析

目录 引言公有云私有云混合云三种部署模式的对比选择建议未来趋势结语 1. 引言 随着云计算技术的快速发展,企业在选择云部署模式时面临着多种选择。本文将深入探讨云计算的三种主要部署模式:公有云、私有云和混合云,帮助读者全面了解它们的特点、优势及适用场景。 © iv…

JavaScript 中的 CSS 与页面响应式设计

JavaScript 中的 CSS 与页面响应式设计 JavaScript 中的 CSS 与页面响应式设计1. 引言2. JavaScript 与 CSS 的基本概念2.1 CSS 的作用2.2 JavaScript 的作用 3. 动态控制样式&#xff1a;JavaScript 修改 CSS 的方法3.1 使用 document.styleSheets API3.2 使用 classList 修改…

【深度学习框架】MXNet(Apache MXNet)

MXNet&#xff08;Apache MXNet&#xff09;是一个 高性能、可扩展 的 开源深度学习框架&#xff0c;支持 多种编程语言&#xff08;如 Python、R、Scala、C 和 Julia&#xff09;&#xff0c;并能在 CPU、GPU 以及分布式集群 上高效运行。MXNet 是亚马逊 AWS 官方支持的深度学…

民法学学习笔记(个人向) Part.2

民法学学习笔记(个人向) Part.2 民法始终在解决两个生活中的核心问题&#xff1a; 私法自治&#xff1b;交易安全&#xff1b; 3. 自然人 3.4 个体工商户、农村承包经营户 都是特殊的个体经济单位&#xff1b; 3.4.1 个体工商户 是指在法律的允许范围内&#xff0c;依法经…

开源2+1链动模式AI智能名片S2B2C商城小程序:利用用户争强好胜心理促进分享行为的策略研究

摘要&#xff1a;随着互联网技术的快速发展和社交媒体的普及&#xff0c;用户分享行为在企业营销中的作用日益凸显。本文旨在探讨如何利用用户的争强好胜心理&#xff0c;通过开源21链动模式AI智能名片S2B2C商城小程序&#xff08;以下简称“小程序”&#xff09;促进用户分享行…

C++六大默认成员函数

C六大默认成员函数 默认构造函数默认析构函数RAII技术RAII的核心思想优点示例应用场景 默认拷贝构造深拷贝和浅拷贝 默认拷贝赋值运算符移动构造函数&#xff08;C11起&#xff09;默认移动赋值运算符&#xff08;C11起&#xff09;取地址及const取地址操作符重载取地址操作符重…

Github 2025-02-02 php开源项目日报 Top10

根据Github Trendings的统计,今日(2025-02-02统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10Blade项目1Laravel:表达力和优雅的 Web 应用程序框架 创建周期:4631 天开发语言:PHP, BladeStar数量:75969 个Fork数量:24281 次…

手写instanceof、手写new操作符

文章目录 1 手写instanceof2 手写new操作符 1 手写instanceof instanceof&#xff1a;用于判断构造函数的prototype属性是否出现在对象原型链中的任何位置实现步骤&#xff1a; 获取类型的原型。获取对象的原型。一直循环判断对象的原型是否等于构造函数的原型对象&#xff0c…