题目地址:https://leetcode-cn.com/problems/implement-stack-using-queues/
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通队列的全部四种操作(push、top、pop 和 empty)。 实现 MyStack 类:void push(int x) 将元素 x 压入栈顶。 int pop() 移除并返回栈顶元素。int top() 返回栈顶元素。 boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。 注意:你只能使用队列的基本操作 —— 也就是push to back、peek/pop from front、size 和is empty这些操作。 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列, 只要是标准的队列操作即可。
示例: 输入:["MyStack", "push", "push", "top", "pop", "empty"] [[], [1], [2], [], [], []] 输出:[null, null, null, 2, 2, false] 解释:MyStack myStack = new MyStack(); myStack.push(1); myStack.push(2); myStack.top(); // 返回 2 myStack.pop(); // 返回 2 myStack.empty(); // 返回 False
提示:1 <= x <= 9 最多调用100 次 push、pop、top 和 empty 每次调用 pop 和 top 都保证栈不为空 进阶:你能否实现每种操作的均摊时间复杂度为 O(1) 的栈?换句话说,执行 n 个操作的总时间复杂度 O(n) ,尽管其中某个操作可能需要比其他操作更长的时间。你可以使用两个以上的队列
这个题目的意思就是,让你实现一个栈,实现他的push、pop、top、empty功能,分别是插入,拿出并删除堆中数据,拿出,清空。
这里我想到了用数组和用链表来做的做法,结果如下:
一、数组法
数组法主要是参考ArrayList的思维,这里因为不需要传入一个初始容量,所以直接写死,扩容就是2倍。
执行结果如下:
16 / 16 个通过测试用例
状态:通过
执行用时: 0 ms
内存消耗: 36.3 MB
// 数组实现
// 栈
private int[] value;
// 栈顶指针
private int stackHead = 0;
// 栈容量
private int capacity;
// 栈占用值
private int size = 0;
public Easy225() {
capacity = 10;
value = new int[capacity];
}
public void pushMe(int x) {
if(size == capacity) {
int[] newValue = new int[capacity << 1];
System.arraycopy(value,0,newValue,0,size);
value = newValue;
}
value[++stackHead] = x;
++size;
}
public int popMe() {
int ans = topMe();
--stackHead;
--size;
return ans;
}
public int topMe() {
return value[stackHead];
}
public boolean emptyMe() {
return 0 == size;
}
二、链表法
链表法主要是保存头尾节点,尾节点就是栈顶,头节点就是栈底(反过来可以当队列用)
执行结果如下:
16 / 16 个通过测试用例
状态:通过
执行用时: 0 ms
内存消耗: 36.1 MB
// 链表实现
private StackNode head;
private StackNode end;
@Data
class StackNode{
private StackNode preNode;
private StackNode nextNode;
private int val;
public StackNode(int val){
this.val = val;
}
}
public Easy225() {
}
public void push(int x) {
StackNode newEnd = new StackNode(x);
if (null == head && end == null) {
head = newEnd;
end = newEnd;
} else {
end.nextNode = newEnd;
newEnd.preNode = end;
end = newEnd;
}
}
public int pop() {
int ans = top();
if (head == end) {
head = null;
end = null;
} else {
this.end = end.preNode;
}
return ans;
}
public int top() {
return end.val;
}
public boolean empty() {
return null == head && null == end;
}
没有根据题目要求用官方的队列而是自己实现,主要原因是之前面一个大公司的时候让我自己手写实现一个队列,所以这里我就尽可能的自己实现了,可能在算法或者空间上比用api辣鸡,但是至少有这个实现的感觉,以后面试就不慌了,毕竟自己是面向面试学习hhhhhhhhhhhh
next