232. 用栈实现队列 (Implement Queue using Stacks)

用栈实现队列 (Implement Queue using Stacks)

题目描述

使用两个栈实现一个队列。队列的操作包括 push(x)pop()peek()empty()

示例:

MyQueue queue = new MyQueue();queue.push(1);
queue.push(2);  
queue.peek();  // 返回 1
queue.pop();   // 返回 1
queue.empty(); // 返回 false

注意:

  • 你只能使用标准的栈操作,即 push to toppeek/pop from topsizeis empty 这些操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
  • 假设所有操作都是有效的。例如,当队列为空时,不调用 poppeek 操作。

代码实现

class MyQueue {private var stack1: [Int]private var stack2: [Int]/** Initialize your data structure here. */init() {stack1 = [Int]()stack2 = [Int]()}/** Push element x to the back of queue. */func push(_ x: Int) {stack1.append(x)}/** Removes the element from in front of queue and returns that element. */func pop() -> Int {if stack2.isEmpty {while !stack1.isEmpty {stack2.append(stack1.removeLast())}}return stack2.removeLast()}/** Get the front element. */func peek() -> Int {if stack2.isEmpty {while !stack1.isEmpty {stack2.append(stack1.removeLast())}}return stack2.last!}/** Returns whether the queue is empty. */func empty() -> Bool {return stack1.isEmpty && stack2.isEmpty}
}

注意点

在 Swift 中,Array 的实例(或对象)方法 removeFirst()removeLast() 除了执行本身的 remove 操作,还会 return 对应 removed 元素。

// Removes and returns the first element of the collection.
@discardableResult
@inlinable public mutating func removeFirst() -> Element
// Removes and returns the last element of the collection.
@discardableResult
@inlinable public mutating func removeLast() -> Element

// Error: Cannot use mutating member on immutable value of type '[Int]'
[1,2,3].removeFirst()

在 Swift 中,如果你试图在不可变数组上调用可变方法(例如 removeFirst()),会导致错误。为了修复这个错误,你需要确保数组是可变的。下面是一些正确处理的方式:

使用可变数组

确保你的数组是用 var 声明的,这样你就可以对它进行修改。

var array = [1, 2, 3]
array.removeFirst()  // 现在不会报错
print(array)  // 输出: [2, 3]

使用不可变数组并创建可变副本

如果你的数组必须是不可变的,你可以创建一个可变副本来进行修改。

let immutableArray = [1, 2, 3]
var mutableArray = immutableArray
mutableArray.removeFirst()
print(mutableArray)  // 输出: [2, 3]

完整示例

以下是如何在实际代码中使用可变数组的示例:

func processArray() {var array = [1, 2, 3]array.removeFirst()print(array)  // 输出: [2, 3]
}processArray()

通过确保数组是可变的,你可以成功调用诸如 removeFirst() 之类的可变方法,而不会遇到错误。


拓展 - Swift 中为什么没有原生支持的 Stack 和 Queue 数据结构 ?

Swift 中没有原生支持的 Stack 和 Queue 数据结构的原因主要有以下几个方面:

1. 泛用数据结构的灵活性

Swift 标准库提供了一些强大的泛用数据结构,例如 ArrayDictionary,它们可以用来构建多种不同的数据结构。Array 本身就可以方便地用来实现 Stack 和 Queue,只需要添加一些扩展方法。例如:

// 实现 Stack
struct Stack<T> {private var elements: [T] = []mutating func push(_ element: T) {elements.append(element)}mutating func pop() -> T? {return elements.popLast()}func peek() -> T? {return elements.last}var isEmpty: Bool {return elements.isEmpty}
}// 实现 Queue
struct Queue<T> {private var elements: [T] = []mutating func enqueue(_ element: T) {elements.append(element)}mutating func dequeue() -> T? {return elements.isEmpty ? nil : elements.removeFirst()}func peek() -> T? {return elements.first}var isEmpty: Bool {return elements.isEmpty}
}

2. 避免标准库臃肿

Swift 的设计哲学之一是保持标准库的精简和高效。如果每种数据结构都在标准库中提供实现,会导致标准库变得非常庞大和复杂。相反,Swift 鼓励开发者根据具体需求自己实现或使用第三方库。

3. 泛型与扩展

Swift 的泛型和扩展机制使得开发者可以很方便地定义自己的数据结构。通过泛型,可以实现类型安全的 Stack 和 Queue,而不需要依赖标准库中的实现。

4. 社区与第三方库支持

Swift 社区中有很多高质量的第三方库提供了各种数据结构的实现,例如 Swift Algorithm Club 就包含了丰富的数据结构和算法的实现。这种模式让标准库保持精简的同时,也能满足开发者的多样化需求。

结论

虽然 Swift 标准库没有原生支持 Stack 和 Queue 数据结构,但通过利用 Swift 强大的泛型和扩展机制,开发者可以很容易地自己实现这些数据结构。再加上丰富的第三方库支持,开发者可以根据需要选择最适合自己的解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/38075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入剖析C++多态的实现与原理-详解 (三万字)

100编程书屋_孔夫子旧书网 目录 一、多态基础 虚函数 虚函数的继承虚类/虚基类重写/覆盖 条件:概念:多态的条件 其他的多态行为 多态中子类可以不写virtual协变 代码举例继承遗留问题解决 析构函数 具体解决方式:题目1 答案:解析:题目2 答案:C11 override和final final 功能1…

web渗透-反序列化漏洞

一、简介 就是把一个对象变成可以传输的字符串&#xff0c;目的就是为了方便传输。假设&#xff0c;我们写了一个class,这个class里面存有一些变量。当这个class被实例化了之后&#xff0c;在使用过程中里面的一些变量值发生了改变。以后在某些时候还会用到这个变量&#xff0…

ctfshow sqli-libs web541--web551

web541 and和or 被替换为空格 # 还有 1 也是不能生效的?id-1 union select 1,2,3-- 双写绕过 ?id-1 union select 1,(select group_concat(table_name) from infoorrmation_schema.tables where table_schemactfshow),3 -- flags?id-1 union select 1,(select group_con…

Nginx软件的安装及使用

Nginx概述 Nginx功能介绍 静态的web资源服务器html&#xff0c;图片&#xff0c;js&#xff0c;css&#xff0c;txt等静态资源http/https协议的反向代理 &#xff0c;7层 url结合FastCGI /uWSGI/SCGI等协议反向代理动态资源请求tcp/udp协议的请求转发&#xff08;反向代理…

计算二叉树的深度

#include <iostream> // 定义二叉树节点 struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} }; // 递归函数来计算二叉树的深度 int maxDepth(TreeNode* root) { i…

【Linux】Linux系统配置,linux的交互方式

1.Linux系统环境安装 有三种方式 裸机安装或者双系统 -- 不推荐虚拟机安装 --- 不推荐云服务器/安装简单&#xff0c; 维护成本低——推荐&#xff0c; 未来学习效果好 我们借助云服务器 云服务器&#xff08;Elastic Compute Service&#xff0c;ECS&#xff09;的标准定义…

以太网交换机原理

没有配置&#xff0c;比较枯燥&#xff0c;二可以认识线缆&#xff0c; 三比较重要&#xff0c;慢慢理解&#xff0c;事半功倍。 各位老少爷们&#xff0c;在下给大家说段以太网交换机原理&#xff0c;说得不好大家多多包涵&#xff0c;说得好呢&#xff0c;大家叫个好&#x…

【面试系列】数据分析师高频面试题及详细解答

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…

数据库回表介绍

索引覆盖 索引覆盖或称为覆盖索引&#xff0c;是数据库中的一种优化手段当我们在执行一个sql查询时&#xff0c;如果只需要查询某几个字段的值&#xff0c;并且这几个字段的数据都已经被包含在某一个索引中(而不是全表扫描)&#xff0c;那么数据库引擎就会直接通过这个索引来取…

使用slenium对不同元素进行定位实战篇~

单选框Radio定位&#xff1a; 单选框只能点击一个&#xff0c;并且点击之后并不会被取消&#xff0c;而多选框&#xff0c;能够点击多个&#xff0c;并且点击之后可以取消 import org.junit.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; imp…

FastAPI教程III

本文参考FastAPI教程https://fastapi.tiangolo.com/zh/tutorial 这部分暂无需求的没有记录&#xff0c;仅放置标题。 依赖项 安全性 中间件 你可以向FastAPI应用添加中间件。 ”中间件“是一个函数&#xff0c;它在每个请求被特定的路径操作处理之前&#xff0c;以及在每个…

PyCharm 2024.1 版本更新亮点:智能编程,高效协作

目录 1. 前言2. 更新内容2.1 智能编码体验2.1.1 Hugging Face 文档预览2.1.2 全行代码补全 2.2 提升编辑器体验2.2.1 粘性行功能2.2.2 编辑器内代码审查 2.3 全新终端体验&#xff08;测试版&#xff09;2.3.1 新终端 Beta 2.4 智能助手&#xff08;特定版本和专业用户&#xf…

短视频矩阵系统:打造品牌影响力的新方式

一、短视频矩阵概念 短视频营销革命&#xff1a;一站式解决策略&#xff01;短视频矩阵系统是一款专为企业营销设计的高效工具&#xff0c;旨在通过整合和优化众多短视频平台资源&#xff0c;为企业呈现一个全面的短视频营销策略。该系统致力于协助企业以迅速且高效的方式制作…

小白学webgl合集-WebGL中给图片添加背景

一.实现效果 二.逻辑 为了在WebGL中给图片添加背景&#xff0c;主要的逻辑步骤包括初始化WebGL上下文、编写和编译着色器、创建和绑定缓冲区、加载和配置纹理以及绘制场景。以下是代码逻辑的详细说明&#xff1a; 1. 获取WebGL上下文 首先&#xff0c;通过获取<canvas>…

WEB与低代码:B/S架构在开发中的应用与优势

在互联网迅猛发展的今天&#xff0c;WEB应用已经成为人们日常生活和工作中不可或缺的一部分。随着技术的进步和需求的多样化&#xff0c;开发高效、灵活且易于维护的WEB应用变得尤为重要。B/S架构&#xff08;Browser/Server Architecture&#xff09;作为一种常见的WEB应用架构…

天天生鲜数据库设计

目录 1、用户表2、商品表SKU和SPU的概念区分3、商品表改进4、redis实现购物车模块&#xff0c;redis保存用户最近浏览记录5、订单表 设计表时&#xff0c;出现一对多的情况&#xff0c;可以将对应的“多”单独拿出来重新设计一个表 1、用户表 &#xff08;灰色的部分不存在表…

MySQL之如何处理超大分页

如何处理MySQL超发分页&#xff1f; 可以使用覆盖索引解决 【点击进入】 MySQL超大分页处理 在数据量较大时&#xff0c;如果使用limit分页查询&#xff0c;在查询时&#xff0c;越往后&#xff0c;分页查询效率会越低。 示例&#xff1a; select * from user limit 900000…

Spring 的表单处理

Spring 提供了强大的表单处理功能&#xff0c;简化了 Web 应用程序中用户输入数据的绑定和校验。在这篇文章中&#xff0c;我们将深入探讨 Spring 的表单处理机制&#xff0c;包括表单提交、使用 ModelAttribute 进行数据绑定、数据绑定与校验&#xff0c;以及使用 Valid 和 Bi…

仓库管理系统带万字文档基于spingboot vue的前后端分离仓库管理系统java项目java课程设计java毕业设计

文章目录 仓库管理系统一、项目演示二、项目介绍三、万字项目文档四、部分功能截图五、部分代码展示六、底部获取项目源码带万字文档&#xff08;9.9&#xffe5;带走&#xff09; 仓库管理系统 一、项目演示 仓库管理系统 二、项目介绍 基于spingboot和vue的前后端分离仓库管…

vue 中computed和watch的区别

computed与watch的区别 首先&#xff0c;computed是计算属性&#xff0c;watch是监听&#xff0c;监听data中的数据变化。 computed的计算属性它支持缓存&#xff0c;只有当依赖项发生改变的时候&#xff0c;它才会重新计算&#xff0c;否则它用的就是缓存的值。watch不支持缓…