当前位置: 面试刷题>> 最小栈(经典算法150题)


### 题目描述 **最小栈** 设计一个支持 `push`、`pop`、`top` 操作以及获取当前栈中最小元素的 `getMin` 操作的栈。 - `push(x)`:将元素 `x` 压入栈中。 - `pop()`:移除栈顶元素,并返回该元素。 - `top()`:返回栈顶元素,但不移除它。 - `getMin()`:返回栈中的最小元素。 **注意**: - 栈中的元素均为整数。 - 栈的操作数可能很大,因此 `getMin` 操作的时间复杂度应尽可能低。 ### 示例 假设我们进行以下操作: ``` MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); print(minStack.getMin()); // 返回 -3 minStack.pop(); print(minStack.top()); // 返回 0 print(minStack.getMin()); // 返回 -2 ``` ### PHP 示例代码 ```php class MinStack { private $stack; private $minStack; function __construct() { $this->stack = array(); $this->minStack = array(); } function push($x) { array_push($this->stack, $x); if (empty($this->minStack) || $x <= end($this->minStack)) { array_push($this->minStack, $x); } } function pop() { $top = array_pop($this->stack); if ($top == end($this->minStack)) { array_pop($this->minStack); } return $top; } function top() { return end($this->stack); } function getMin() { return end($this->minStack); } } // 使用示例 $minStack = new MinStack(); $minStack->push(-2); $minStack->push(0); $minStack->push(-3); echo $minStack->getMin(); // 输出: -3 $minStack->pop(); echo $minStack->top(); // 输出: 0 echo $minStack->getMin(); // 输出: -2 ``` ### Python 示例代码 ```python class MinStack: def __init__(self): self.stack = [] self.minStack = [] def push(self, x: int) -> None: self.stack.append(x) if not self.minStack or x <= self.minStack[-1]: self.minStack.append(x) def pop(self) -> None: if self.stack and self.stack[-1] == self.minStack[-1]: self.minStack.pop() self.stack.pop() def top(self) -> int: return self.stack[-1] if self.stack else None def getMin(self) -> int: return self.minStack[-1] if self.minStack else None # 使用示例 minStack = MinStack() minStack.push(-2) minStack.push(0) minStack.push(-3) print(minStack.getMin()) # 输出: -3 minStack.pop() print(minStack.top()) # 输出: 0 print(minStack.getMin()) # 输出: -2 ``` ### JavaScript 示例代码 ```javascript class MinStack { constructor() { this.stack = []; this.minStack = []; } push(x) { this.stack.push(x); if (this.minStack.length === 0 || x <= this.minStack[this.minStack.length - 1]) { this.minStack.push(x); } } pop() { if (this.stack.pop() === this.minStack[this.minStack.length - 1]) { this.minStack.pop(); } } top() { return this.stack[this.stack.length - 1]; } getMin() { return this.minStack[this.minStack.length - 1]; } } // 使用示例 const minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); console.log(minStack.getMin()); // 输出: -3 minStack.pop(); console.log(minStack.top()); // 输出: 0 console.log(minStack.getMin()); // 输出: -2 ``` 通过这些示例代码,你可以看到如何通过维护一个辅助栈(`minStack`)来高效地实现获取栈中最小元素的功能。
推荐面试题