LeetCode 225. 用队列实现栈
题目描述
思路分析
解法一:单队列旋转(推荐)
核心思路:
- 入栈时把新元素入队,然后把之前的元素依次出队再入队。
- 这样队头始终是“栈顶”,
pop/top直接操作队头即可。- 空间仍然是一个队列结构。
复杂度分析:
- 时间复杂度:
push为 O(n),pop/top为 O(1)。- 空间复杂度:O(n),其中 n 为栈内元素数量。
class MyStack {
private final Deque<Integer> queue = new ArrayDeque<>();
public MyStack() {}
public void push(int x) {
queue.offer(x);
// 旋转队列,让新元素到队头
for (int i = 0; i < queue.size() - 1; i++) {
queue.offer(queue.poll());
}
}
public int pop() {
return queue.poll();
}
public int top() {
return queue.peek();
}
public boolean empty() {
return queue.isEmpty();
}
}
type MyStack struct {
q []int
}
func Constructor() MyStack {
return MyStack{q: make([]int, 0)}
}
func (s *MyStack) Push(x int) {
s.q = append(s.q, x)
// 旋转队列,让新元素到队头
for i := 0; i < len(s.q)-1; i++ {
v := s.q[0]
s.q = append(s.q[1:], v)
}
}
func (s *MyStack) Pop() int {
v := s.q[0]
s.q = s.q[1:]
return v
}
func (s *MyStack) Top() int {
return s.q[0]
}
func (s *MyStack) Empty() bool {
return len(s.q) == 0
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 232. 用栈实现队列 | 简单 | 数据结构模拟 |
| 155. 最小栈 | 简单 | 栈设计 |
| 20. 有效的括号 | 简单 | 栈匹配 |
| 150. 逆波兰表达式求值 | 中等 | 栈应用 |
| 735. 小行星碰撞 | 中等 | 栈模拟 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!