题目:用两个栈实现一个队列。队列的生命如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。
package 数据结构;
import java.util.Stack;
/**
*题目:用两个栈实现一个队列。队列的生命如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。
*/
public class Queue {
//栈的特点 后进先出
//队列 先进先出
//用两个栈实现一个队列
/**
*思路:首先,用一个栈用来接收添加的元素。通过观察发现,将接收的队列翻转后,即与队列中存放的元素顺序相同,
*所以,可以在另一个栈中接收其翻转的队列,并且在反转后的队列中进行弹栈操作。所以不断访问翻转后的栈的栈顶元素,
*如果访问到需要出栈的元素是,停止访问, 进行弹栈。
*
*/
Stack<Integer> addStack = new Stack<Integer>();
Stack<Integer> popStack = new Stack<Integer>();
public void appendTail(int element) {
addStack.push(element);
}
public void deleteHead(int element) {
//用来判断当前栈内是否有即将被弹栈的元素,如果没有,则不进行弹栈。
Boolean isHasElement = false;
while (!addStack.isEmpty()) {
popStack.push(addStack.peek());
addStack.pop();
}
for (int a : popStack) {
if (a == element) {
isHasElement = true;
}
}
if (!popStack.isEmpty()) {
if (isHasElement) {
while (!popStack.isEmpty() && !popStack.peek().equals(element)) {
System.out.println("被弹出的元素:" + popStack.peek().toString() + " ");
popStack.pop();
}
// 最后那个要被弹出的元素
if (!popStack.isEmpty()) {
popStack.pop();
}
}
while (!popStack.isEmpty()) {
addStack.add(popStack.peek());
popStack.pop();
}
}
}
public String toString() {
while (!addStack.isEmpty()) {
System.out.println("列表剩余元素:" + addStack.pop().toString());
}
return null;
}
/**
* 这里有个疑问,不知道是否可以让一个没有在该对列的数字进行出列,如果可以让其出列。
* 有两种实现,一:在前面出列时遍历队列中是否有该数,二是在操作deleteHead的时候判断。
* 现用方法二。
*/
public static void main(String[] args) {
Queue queue = new Queue();
queue.appendTail(1);
queue.appendTail(2);
queue.appendTail(2);
queue.appendTail(2);
// queue.deleteHead(2);
queue.appendTail(3);
queue.appendTail(4);
queue.appendTail(5);
queue.deleteHead(9);
queue.appendTail(6);
queue.appendTail(4);
queue.deleteHead(2);
queue.toString();
}
}