题目
用两个队列模拟实现栈的操作原题链接
思路
我是用两个list模拟的,没有用java的queue,下次用queue。
思想就是:元素进入一个list1,当list1中元素多余1个时,将list1的末尾元素放进list2,然后再将list1其余元素从头至尾的进入list2,这样后进的元素就在第一个位置了,再将list2赋给list1,清空lisr2,方便下次有元素再进行操作。
代码
class MyStack {
List<Integer> queue1;
List<Integer> queue2;
public MyStack() {
queue1 = new ArrayList<>();
queue2 = new ArrayList<>();
}
public void push(int x) {
queue1.add(x);
if(queue1.size() > 1) {
queue2.add(queue1.get(queue1.size() - 1));
for(int i = 0; i < queue1.size() - 1; i++) {
queue2.add(queue1.get(i));
}
queue1 = queue2;
queue2 = new ArrayList<>();
//queue2.clear();这样写,会在下面下面的 return queue1.get(0); 中报错下标越界
}
}
public int top() {
return queue1.get(0);
}
public int pop() {
int peak = queue1.get(0);
queue1.remove(0);
return peak;
}
public boolean empty() {
return queue1.isEmpty();
}
}
总结
这个方法虽然实现了,但是空间复杂度比较高,因为每次都会new一个新的ArrayList,我本想用 clear() 方法情况queue2,但是会导致下面的top方法报错,目前不太清楚什么原因,以后解决了再来补上。