小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
leetcode232-用栈实现队列
前文
本文为菜鸟的刷题记录,仅用作笔记使用,并非最佳解决方案。
题目信息
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回元素 int peek() 返回队列开头的元素 boolean empty() 如果队列为空,返回 true ;否则,返回 false
解题思路分析
解法1
用栈实现队列主要是结合栈和队列的性质进行操作。当向队列中添加元素时,将元素存储在栈顶。当从队列中移除元素时,即为移除首个放入栈中的元素。这种情况下需要将栈中元素出栈后再重新入栈,并将最后一个元素移除。同理,获取队列的首个元素时,则需要将栈进行出栈入栈操作,返回栈中位于栈底的元素。而判断队列是否为空的操作,也就是判断栈是否为空,可以直接调用栈的api。 代码如下:
public class MyQueue {
Stack stack;
public MyQueue() {
stack = new Stack();
}
public void push(int x) {
stack.add(x);
}
public int pop() {
Stack newStack = new Stack();
int result = -1;
int length = stack.size();
for (int i = 0; i < length; i++) {
newStack.add(stack.pop());
}
result = (int)newStack.pop();
length = newStack.size();
for (int i = 0; i < length; i++) {
stack.add(newStack.pop());
}
return result;
}
public int peek() {
Stack newStack = new Stack();
int result = -1;
int length = stack.size();
for (int i = 0; i < length; i++) {
if(i == length-1){
result = (int)stack.peek();
}
newStack.add(stack.pop());
}
length = newStack.size();
for (int i = 0; i < length; i++) {
stack.add(newStack.pop());
}
return result;
}
public boolean empty() {
return stack.isEmpty();
}
}
复制代码
复杂度分析
本文较为特殊忽略不计。
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。