方法一:
既然堆栈是先入后出,那么两个堆栈第一个用于加入尾数据时存储,第二个用于删除头数据时将第一个堆栈中的元素按先入后出再加入第二个堆栈,这样第二个堆栈顶部就是当前队列的头元素,此时就可以删除头元素。
删除后再将第二个堆栈元素放回第一个堆栈继续添加数据的操作。
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();
}
思路是两个堆栈分别用于添加尾数据和删除头数据,添加的函数和方法一相同,即堆栈一用于添加数据。
堆栈二用于删除数据,即当堆栈二为空,需要将堆栈一的元素全部按先入后出规则放入堆栈二,再次判断
若仍然为空,则说明队列无元素。
若非空,将堆栈二堆顶的元素删除即可。
方法二相对于方法一省去了将删除后元素放回的步骤,实际将一串数据两次添加到堆栈中,第二个堆栈里的数据就是按先入先出原则排列的,此时堆栈一仍然保持添加数据的功能,当遇到删除头数据只需要将堆栈二的堆顶数据依次删除即可。
该博客介绍了如何使用两个堆栈来模拟队列的操作,包括`appendTail`(添加尾元素)和`deleteHead`(删除头元素)。方法一是通过将堆栈一的数据全部转移到堆栈二,然后从堆栈二删除头元素;方法二则是在堆栈二为空时直接将堆栈一数据转移,避免了转移回堆栈一的步骤。这两种方法都利用了堆栈的特性实现了队列的FIFO(先进先出)原则。
873

被折叠的 条评论
为什么被折叠?



