方法一:
既然堆栈是先入后出,那么两个堆栈第一个用于加入尾数据时存储,第二个用于删除头数据时将第一个堆栈中的元素按先入后出再加入第二个堆栈,这样第二个堆栈顶部就是当前队列的头元素,此时就可以删除头元素。
删除后再将第二个堆栈元素放回第一个堆栈继续添加数据的操作。
LinkedList<Integer> stack1;
LinkedList<Integer> stack2;
public CQueue() {
this.stack1 = new LinkedList<>();
this.stack2 = new LinkedList<>();
}
public void appendTail(int value) {
stack1.addLast(value);
}
public int deleteHead() {
int res;
if (stack1.isEmpty()) {
return -1;
}
while (!stack1.isEmpty()) {
stack2.addLast(stack1.removeLast());
}
res = stack2.removeLast();
while (!stack2.isEmpty()) {
stack1.addLast(stack2.removeLast());
}
return res;
}
方法二:
public int deleteHead1() {
if (stack2.isEmpty()) {
while (!stack1.isEmpty()) {
stack2.addLast(stack1.removeLast());
}
}
if (stack2.isEmpty()) {
return -1;
}
return stack2.removeLast();
}
思路是两个堆栈分别用于添加尾数据和删除头数据,添加的函数和方法一相同,即堆栈一用于添加数据。
堆栈二用于删除数据,即当堆栈二为空,需要将堆栈一的元素全部按先入后出规则放入堆栈二,再次判断
若仍然为空,则说明队列无元素。
若非空,将堆栈二堆顶的元素删除即可。
方法二相对于方法一省去了将删除后元素放回的步骤,实际将一串数据两次添加到堆栈中,第二个堆栈里的数据就是按先入先出原则排列的,此时堆栈一仍然保持添加数据的功能,当遇到删除头数据只需要将堆栈二的堆顶数据依次删除即可。