03.01、三合一

embedded/2024/11/18 5:33:53/

03.01、leetcode.cn/problems/three-in-one-lcci/" rel="nofollow">[简单] 三合一

1、题目描述

三合一。描述如何只用一个数组来实现三个栈。

你应该实现push(stackNum, value)pop(stackNum)isEmpty(stackNum)peek(stackNum)方法。stackNum表示栈下标,value表示压入的值。

构造函数会传入一个stackSize参数,代表每个栈的大小。

2、方法思路

  1. 数组表示栈:我们可以使用一个数组 arr 来表示三个栈。数组被划分为三个部分,每部分存储一个栈的元素。栈 1 的索引范围是 [0, stackSize-1],栈 2 的范围是 [stackSize, 2*stackSize-1],栈 3 的范围是 [2*stackSize, 3*stackSize-1]
  2. 辅助指针数组:用一个长度为 3 的数组 tops,存储每个栈的栈顶索引(即当前元素的存储位置),通过栈的编号 stackNum 来访问对应的栈。
  3. 操作限制
    • 在进行 push 操作时,需要检查栈是否已经满了。
    • poppeek 操作在栈为空时应返回 -1。

3、代码实现

class TripleInOne {
private:vector<int> arr;  // 用来存储三个栈的数据vector<int> tops; // 栈指针, 指向三个栈的下一个可用位置int stackSize;    // 每个栈的最大容量public:// 初始化: 设置栈的大小, 初始化数组和栈顶指针TripleInOne(int stackSize) {this->stackSize = stackSize;      // 保存栈的大小arr.resize(3 * stackSize); // 数组容量是三个栈的总容量// 初始化三个栈的指针// 栈 1 从 0 开始, 栈 2 从 stackSize 开始, 栈 3 从 2*stackSize 开始tops = {0, stackSize, 2 * stackSize};}// 向指定的栈中压入一个元素void push(int stackNum, int value) {// 检查当前栈是否已满if (tops[stackNum] < (stackNum + 1) * stackSize) {arr[tops[stackNum]++] = value; // 插入值并更新栈顶索引}}// 从指定的栈中弹出栈顶元素int pop(int stackNum) {if (isEmpty(stackNum)) { // 栈为空时返回-1return -1;}return arr[--tops[stackNum]]; // 弹出栈顶元素并更新栈顶索引}// 查看指定栈的栈顶元素int peek(int stackNum) {// 检查栈是否为空if (isEmpty(stackNum)) { // 栈为空时返回-1return -1;}return arr[tops[stackNum] - 1]; // 返回栈顶元素}// 判断指定栈是否为空bool isEmpty(int stackNum) {// 如果栈指针等于栈的起始位置,说明栈为空return tops[stackNum] == stackSize * stackNum;}
};

4、代码解析

  • 构造函数 TripleInOne(int stackSize):
    • 初始化 arr 数组大小为 3 * stackSize,以容纳三个栈的数据。
    • 初始化 tops 数组,分别为三个栈的初始位置:栈 1 为 0,栈 2 为 stackSize,栈 3 为 2 * stackSize
  • push(int stackNum, int value):
    • 先检查当前栈是否已满(通过检查指针是否超出该栈的边界),若未满,则将值压入并更新指针。
  • pop(int stackNum):
    • 检查栈是否为空,若为空则返回 -1;否则更新指针并返回栈顶元素。
  • peek(int stackNum):
    • 检查栈是否为空,若为空则返回 -1;否则返回栈顶元素。
  • isEmpty(int stackNum):
    • 通过比较指针位置是否等于栈的初始位置来判断栈是否为空。

5、时间复杂度

  • pushpoppeekisEmpty 操作的时间复杂度均为 O(1),因为每次操作只需更新栈指针或访问数组中的一个元素。

这个解决方案使用了固定大小的数组来实现三个栈的分隔,逻辑简单且效率高。在面试中这是一个常见的问题,考察你对栈和数组的理解,以及如何在限制条件下实现数据结构


http://www.ppmy.cn/embedded/138448.html

相关文章

20.useMediaQuery

React useMediaQuery 钩子:如何优雅地实现响应式设计? 在现代 Web 开发中,响应式设计是一个关键概念,它允许应用根据不同的屏幕尺寸和设备特性调整其布局和行为。useMediaQuery 钩子提供了一种声明式的方法来在 React 组件中使用媒体查询,使得响应式逻辑的实现变得简单而…

网络物理隔离技术

目录 网络物理隔离技术物理隔离机制与实现技术其他物理隔离机制与实现技术 网络物理隔离技术 网络物理隔离是既满足内外网数据交换需求&#xff0c;又能防止网络安全事件出现的安全技术称为物理隔离技术。基本原理是避免计算机之间直接连通&#xff0c;以阻断在线网络攻击。 …

民锋科技如何通过量化分析提升金融市场投资决策

在全球化的金融市场中&#xff0c;精准的投资决策依赖于对市场数据的深度分析。民锋科技采用量化分析技术&#xff0c;为投资者提供智能化的市场洞察工具。通过创新算法和数据分析模型&#xff0c;民锋科技帮助投资者在不断波动的市场中抓住机会。本文将解读民锋科技的量化分析…

【更新至 59 个】分子动力学模拟 + LAMMPS + OVITO + 数据处理程序

在当前分子动力学&#xff08;MD&#xff09;研究领域&#xff0c;各类高效且功能强大的软件工具已成为推动科学发现和技术进步的关键。我们将与分子动力学相关的程序进行了汇总&#xff0c;目前已达到59个&#xff0c;将会持续更新。这些程序的主要功能&#xff1a; 【1】View…

李秀贤主演警匪片《蓝色霹雳火》

整日醉生梦死的小工人林守一&#xff08;李修贤 饰&#xff09;当年曾是一名优秀干练的皇家警察&#xff0c;后来他因酒后殴打嫌疑人而被停职查办&#xff0c;感情一向不和的妻子Judy也趁机与其离婚。数年后&#xff0c;重案组警探程曦&#xff08;梁家辉 饰&#xff09;及其助…

linux进程、文件常见命令

文章目录 进程相关命令日志相关命令 进程相关命令 在Linux系统中&#xff0c;有多个命令可以用来管理和监控进程。以下是一些常用的进程相关命令&#xff1a; ps&#xff1a;查看当前运行的进程。 ps aux&#xff1a;显示所有运行中的进程。ps -ef&#xff1a;显示所有进程的…

Ceph层次架构分析

Ceph的层次结构可以从逻辑上自下向上分为以下几个层次&#xff1a; 一、基础存储系统RADOS层 功能&#xff1a;RADOS&#xff08;Reliable Autonomic Distributed Object Store&#xff09;是Ceph的底层存储系统&#xff0c;提供了分布式存储的核心功能。它是一个完整的对象存…

怎么选择香港服务器的线路?解决方案

选择香港服务器的线路方案时&#xff0c;需要考虑多个因素&#xff0c;包括目标用户群体、网络稳定性、带宽成本以及特定的业务需求。以下是一些常见的线路方案及其优缺点&#xff0c;帮助你做出更合适的选择&#xff1a; 1. 直连线路 优点 - 低延迟&#xff1a;直接连接到目标…