《程序员面试金典(第6版)》面试题 03.01. 三合一
创始人
2024-05-30 09:34:41
0

题目描述

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

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

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

示例1:

  • 输入:
    [“TripleInOne”, “push”, “push”, “pop”, “pop”, “pop”, “isEmpty”]
    [[1], [0, 1], [0, 2], [0], [0], [0], [0]]
    输出:
    [null, null, null, 1, -1, -1, true]
    说明:当栈为空时pop, peek返回-1,当栈满时push不压入元素。

示例2:

  • 输入:
    [“TripleInOne”, “push”, “push”, “push”, “pop”, “pop”, “pop”, “peek”]
    [[2], [0, 1], [0, 2], [0, 3], [0], [0], [0], [0]]
    输出:
    [null, null, null, null, 2, 1, -1, -1]

提示:

0 <= stackNum <= 2

在你的写代码的位置,还有一段关于代码的注释,很重要,也需要你去看

// /**
// * Your TripleInOne object will be instantiated and called as such:
// * TripleInOne* obj = new TripleInOne(stackSize);
// * obj->push(stackNum,value);
// * int param_2 = obj->pop(stackNum);
// * int param_3 = obj->peek(stackNum);
// * bool param_4 = obj->isEmpty(stackNum);
// */

解题思路与代码

这道题虽然说是简单题,但是也会让第一次做他的人狠懵。我来带大家心平气和的来读一遍题。

首先,题目要求我们实现,将三个栈,去塞入一个数组中。然后还要求我们去设计栈的push函数,pop函数,top函数(peek)还有就是empty函数(isempty)。

不要被题目给的密密麻麻的输入输出吓到了,它们是一一对应的关系。
当整个栈为空的时候,pop函数,top函数(peek)返回-1;若不为-1,则返回栈顶元素。
若栈被塞满后,继续塞元素则直接返回。
empty函数就是让你去判断栈是否为空,若为空返回true,否则false

现在不知你是否有信心继续面对这道题了。如果有,我们继续。

现在已知每个栈的大小,题目会给你叫做:stackSize,然后一共有三个栈,相当于已知stackNum=3。

二维数组法

首先既然它说用一个数组去实现,那一个一维数组是一个数组,一个二维数组它也是一个数组。我们来看二维数组怎么实现的。

首先,先在创建一个二维的vector,其中的一维就是一个栈,然后栈内的元素,就是题目给的stackSize。

vector> group ;

然后再创建一个一维的vector,它一共有三个元素,分别代表三个组,然后每个元素的数值,就代表着栈内的元素下标。

vector point;

我们刚刚只是在这个类中创建了两个成员变量,我们紧接着来实现它的构造方法。
在构造方法中,我们需要给这两个vector赋予初始值。

group = group = vector>(3,vector(stackSize));
point = vector(3,-1);

说到这里,其实就不用说了吧,剩下的方法,是很好实现的,那么我现在就给整体的代码了:
代码如下:

class TripleInOne {
public:vector> group;vector point;TripleInOne(int stackSize) {group = vector>(3,vector(stackSize));point = vector(3,-1);}void push(int stackNum, int value) {if(point[stackNum]+1 == group[0].size()) return ; //栈满。无法添加元素,原地返回point[stackNum] ++;group[stackNum][point[stackNum]] = value;return ;}int pop(int stackNum) {if(point[stackNum] == -1) return -1;point[stackNum] --;return group[stackNum][point[stackNum]+1]; //根据题意,返回的是未被弹出的栈顶元素}int peek(int stackNum) {if(point[stackNum] == -1) return -1;return group[stackNum][point[stackNum]];}bool isEmpty(int stackNum) {return point[stackNum] == -1;}
};/*** Your TripleInOne object will be instantiated and called as such:* TripleInOne* obj = new TripleInOne(stackSize);* obj->push(stackNum,value);* int param_2 = obj->pop(stackNum);* int param_3 = obj->peek(stackNum);* bool param_4 = obj->isEmpty(stackNum);*/

一维数组法

一维数组法,相对与二维数组法并没有什么明显的优势,其实也是去扣代码中下标的细节。如果你觉得对数组下标的判断吃力无比,请不要担心,不止你一个人是这样。多做,多练,勤思考多总结,就好了。

class TripleInOne {
public:vector group; //用来存放压入栈中的值vector point; //用来记录下一个要压入栈的下标int stackSize; //为了可以让其他的内置函数可以用到这个变量TripleInOne(int stackSize) {this->stackSize = stackSize; //this指针指向的这个stackSize,不是传入参数stackSize,而是成员变量stackSize。意思是让成员变量 = 传入参数。group = vector(3 * stackSize,0);point = vector{0,stackSize,stackSize*2};}void push(int stackNum, int value) {if(point[stackNum] == (stackNum +1) * stackSize) return;group[point[stackNum]] = value;++point[stackNum];}int pop(int stackNum) {if(isEmpty(stackNum)) return -1;--point[stackNum];return group[point[stackNum]];}int peek(int stackNum) {if(isEmpty(stackNum)) return -1;return group[point[stackNum]-1];}bool isEmpty(int stackNum) {return point[stackNum] == stackSize * stackNum;}
};/*** Your TripleInOne object will be instantiated and called as such:* TripleInOne* obj = new TripleInOne(stackSize);* obj->push(stackNum,value);* int param_2 = obj->pop(stackNum);* int param_3 = obj->peek(stackNum);* bool param_4 = obj->isEmpty(stackNum);*/

总结

这一道题,是对自己写类方法写的少的同学的一种考验。此外,还特别考验对数组下标的判断细节。写不好,可能会卡在这里思考很久。不要灰心,多练,多思考,勤总结。总会变得越来越好的。

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...