comments | difficulty | edit_url |
---|---|---|
true |
Easy |
Describe how you could use a single array to implement three stacks.
Yout should implement push(stackNum, value)
、pop(stackNum)
、isEmpty(stackNum)
、peek(stackNum)
methods. stackNum
is the index of the stack. value
is the value that pushed to the stack.
The constructor requires a stackSize
parameter, which represents the size of each stack.
Example1:
Input: ["TripleInOne", "push", "push", "pop", "pop", "pop", "isEmpty"] [[1], [0, 1], [0, 2], [0], [0], [0], [0]] Output: [null, null, null, 1, -1, -1, true] Explanation: When the stack is empty, `pop, peek` return -1. When the stack is full, `push` does nothing.
Example2:
Input: ["TripleInOne", "push", "push", "push", "pop", "pop", "pop", "peek"] [[2], [0, 1], [0, 2], [0, 3], [0], [0], [0], [0]] Output: [null, null, null, null, 2, 1, -1, -1]
We use a variable
For the push
operation, we first check whether the stack is full. If it is not full, we push the element into the stack and update the number of elements in the stack.
For the pop
operation, we first check whether the stack is empty. If it is not empty, we update the number of elements in the stack and return the top element of the stack.
For the peek
operation, we first check whether the stack is empty. If it is not empty, we return the top element of the stack.
For the isEmpty
operation, we directly check whether the stack is empty. For stack
In terms of time complexity, the time complexity of each operation is
class TripleInOne:
def __init__(self, stackSize: int):
self.cap = stackSize
self.stk = [0] * (self.cap * 3 + 3)
def push(self, stackNum: int, value: int) -> None:
if self.stk[self.cap * 3 + stackNum] < self.cap:
self.stk[self.cap * stackNum + self.stk[self.cap * 3 + stackNum]] = value
self.stk[self.cap * 3 + stackNum] += 1
def pop(self, stackNum: int) -> int:
if self.isEmpty(stackNum):
return -1
self.stk[self.cap * 3 + stackNum] -= 1
return self.stk[self.cap * stackNum + self.stk[self.cap * 3 + stackNum]]
def peek(self, stackNum: int) -> int:
if self.isEmpty(stackNum):
return -1
return self.stk[self.cap * stackNum + self.stk[self.cap * 3 + stackNum] - 1]
def isEmpty(self, stackNum: int) -> bool:
return self.stk[self.cap * 3 + stackNum] == 0
# Your TripleInOne object will be instantiated and called as such:
# obj = TripleInOne(stackSize)
# obj.push(stackNum,value)
# param_2 = obj.pop(stackNum)
# param_3 = obj.peek(stackNum)
# param_4 = obj.isEmpty(stackNum)
class TripleInOne {
private int cap;
private int[] stk;
public TripleInOne(int stackSize) {
cap = stackSize;
stk = new int[cap * 3 + 3];
}
public void push(int stackNum, int value) {
if (stk[cap * 3 + stackNum] < cap) {
stk[cap * stackNum + stk[cap * 3 + stackNum]] = value;
++stk[cap * 3 + stackNum];
}
}
public int pop(int stackNum) {
if (isEmpty(stackNum)) {
return -1;
}
--stk[cap * 3 + stackNum];
return stk[cap * stackNum + stk[cap * 3 + stackNum]];
}
public int peek(int stackNum) {
return isEmpty(stackNum) ? -1 : stk[cap * stackNum + stk[cap * 3 + stackNum] - 1];
}
public boolean isEmpty(int stackNum) {
return stk[cap * 3 + stackNum] == 0;
}
}
/**
* 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);
* boolean param_4 = obj.isEmpty(stackNum);
*/
class TripleInOne {
public:
TripleInOne(int stackSize) {
cap = stackSize;
stk.resize(cap * 3 + 3);
}
void push(int stackNum, int value) {
if (stk[cap * 3 + stackNum] < cap) {
stk[cap * stackNum + stk[cap * 3 + stackNum]] = value;
++stk[cap * 3 + stackNum];
}
}
int pop(int stackNum) {
if (isEmpty(stackNum)) {
return -1;
}
--stk[cap * 3 + stackNum];
return stk[cap * stackNum + stk[cap * 3 + stackNum]];
}
int peek(int stackNum) {
return isEmpty(stackNum) ? -1 : stk[cap * stackNum + stk[cap * 3 + stackNum] - 1];
}
bool isEmpty(int stackNum) {
return stk[cap * 3 + stackNum] == 0;
}
private:
int cap;
vector<int> stk;
};
/**
* 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);
*/
type TripleInOne struct {
cap int
stk []int
}
func Constructor(stackSize int) TripleInOne {
return TripleInOne{stackSize, make([]int, stackSize*3+3)}
}
func (this *TripleInOne) Push(stackNum int, value int) {
if this.stk[this.cap*3+stackNum] < this.cap {
this.stk[this.cap*stackNum+this.stk[this.cap*3+stackNum]] = value
this.stk[this.cap*3+stackNum]++
}
}
func (this *TripleInOne) Pop(stackNum int) int {
if this.IsEmpty(stackNum) {
return -1
}
this.stk[this.cap*3+stackNum]--
return this.stk[this.cap*stackNum+this.stk[this.cap*3+stackNum]]
}
func (this *TripleInOne) Peek(stackNum int) int {
if this.IsEmpty(stackNum) {
return -1
}
return this.stk[this.cap*stackNum+this.stk[this.cap*3+stackNum]-1]
}
func (this *TripleInOne) IsEmpty(stackNum int) bool {
return this.stk[this.cap*3+stackNum] == 0
}
/**
* Your TripleInOne object will be instantiated and called as such:
* obj := Constructor(stackSize);
* obj.Push(stackNum,value);
* param_2 := obj.Pop(stackNum);
* param_3 := obj.Peek(stackNum);
* param_4 := obj.IsEmpty(stackNum);
*/
class TripleInOne {
private cap: number;
private stk: number[];
constructor(stackSize: number) {
this.cap = stackSize;
this.stk = Array<number>(stackSize * 3 + 3).fill(0);
}
push(stackNum: number, value: number): void {
if (this.stk[this.cap * 3 + stackNum] < this.cap) {
this.stk[this.cap * stackNum + this.stk[this.cap * 3 + stackNum]] = value;
this.stk[this.cap * 3 + stackNum]++;
}
}
pop(stackNum: number): number {
if (this.isEmpty(stackNum)) {
return -1;
}
this.stk[this.cap * 3 + stackNum]--;
return this.stk[this.cap * stackNum + this.stk[this.cap * 3 + stackNum]];
}
peek(stackNum: number): number {
if (this.isEmpty(stackNum)) {
return -1;
}
return this.stk[this.cap * stackNum + this.stk[this.cap * 3 + stackNum] - 1];
}
isEmpty(stackNum: number): boolean {
return this.stk[this.cap * 3 + stackNum] === 0;
}
}
/**
* Your TripleInOne object will be instantiated and called as such:
* var obj = new TripleInOne(stackSize)
* obj.push(stackNum,value)
* var param_2 = obj.pop(stackNum)
* var param_3 = obj.peek(stackNum)
* var param_4 = obj.isEmpty(stackNum)
*/
class TripleInOne {
private var cap: Int
private var stk: [Int]
init(_ stackSize: Int) {
self.cap = stackSize
self.stk = [Int](repeating: 0, count: cap * 3 + 3)
}
func push(_ stackNum: Int, _ value: Int) {
if stk[cap * 3 + stackNum] < cap {
stk[cap * stackNum + stk[cap * 3 + stackNum]] = value
stk[cap * 3 + stackNum] += 1
}
}
func pop(_ stackNum: Int) -> Int {
if isEmpty(stackNum) {
return -1
}
stk[cap * 3 + stackNum] -= 1
return stk[cap * stackNum + stk[cap * 3 + stackNum]]
}
func peek(_ stackNum: Int) -> Int {
if isEmpty(stackNum) {
return -1
}
return stk[cap * stackNum + stk[cap * 3 + stackNum] - 1]
}
func isEmpty(_ stackNum: Int) -> Bool {
return stk[cap * 3 + stackNum] == 0
}
}
/**
* Your TripleInOne object will be instantiated and called as such:
* let obj = TripleInOne(stackSize)
* obj.push(stackNum,value)
* let param_2 = obj.pop(stackNum)
* let param_3 = obj.peek(stackNum)
* let param_4 = obj.isEmpty(stackNum)
*/