leetcode 链接:三合一

题目

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

  • 你应该实现 push(stackNum, value)pop(stackNum)isEmpty(stackNum)peek(stackNum) 方法。stackNum 表示栈下标,value 表示压入的值。
  • 构造函数会传入一个 stackSize 参数,代表每个栈的大小。

示例:

  1. 输入:
  2. ["TripleInOne", "push", "push", "pop", "pop", "pop", "isEmpty"]
  3. [[1], [0, 1], [0, 2], [0], [0], [0], [0]]
  4. 输出:
  5. [null, null, null, 1, -1, -1, true]
  6. 说明:当栈为空时`pop, peek`返回-1,当栈满时`push`不压入元素。
 输入:
["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、栈1、栈2

class TripleInOne {
private:
    int* arr;        //存储三个栈元素的数组
    int stackSize;    //每个栈的大小
    int top[3];        //三个栈顶下标

public:
    TripleInOne(int stackSize) {    //构造函数
        this->stackSize = stackSize;
        arr = new int[stackSize * 3];
        for(int i = 0; i < 3; ++i)
            top[i] = -1;
    }

    void push(int stackNum, int value) {    //入栈函数
        if(top[stackNum] < stackSize - 1)
        {
            ++top[stackNum];
            arr[stackNum * stackSize + top[stackNum]] = value;
        }
    }

    int pop(int stackNum) {        //出栈函数
        if(top[stackNum] > -1)
        {
            int topVal = arr[stackNum * stackSize + top[stackNum]];
            --top[stackNum];
            return topVal;
        }
        else
            return -1;
    }

    int peek(int stackNum) {    //取栈顶函数
        if(top[stackNum] > -1)
        {
            return arr[stackNum * stackSize + top[stackNum]];
        }
        else
            return -1;
    }

    bool isEmpty(int stackNum) {    //判断栈是否为空
        return top[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);
 */

执行结果:

执行结果:通过

执行用时:88 ms, 在所有 C++ 提交中击败了 32.43% 的用户
内存消耗:32.1 MB, 在所有 C++ 提交中击败了 89.49% 的用户