一、如何只使用队列来实现栈结构
因为队列的结构是先进后出,而栈的数据结构特点是先进先出,所以我们可以搞两个队列,当一个队列进入另外一个队列的时候,只剩下一个元素,留着返回,然后这个队列再进入原来哪个队列只剩下一个元素等着返回,循环使用这个逻辑,即可完成。
/*
* 两个队列实现栈结构
*/
public static class TwoQueuesStack {
//data队列和help队列,使用的是双向链表来完成的
private Queue<Integer> queue;
private Queue<Integer> help;
public TwoQueuesStack() {
queue = new LinkedList<Integer>();
help = new LinkedList<Integer>();
}
public void push(int pushInt) {
queue.add(pushInt);
}
public int peek() {
if (queue.isEmpty()) {
throw new RuntimeException("Stack is empty!");
}
while (queue.size() != 1) {
help.add(queue.poll());
}
int res = queue.poll();
//因为不弹出 所以还得把它放进help栈里
help.add(res);
swap();
return res;
}
public int pop() {
if (queue.isEmpty()) {
throw new RuntimeException("Stack is empty!");
}
//当data队列的长度不为1时往help队列中
while (queue.size() != 1) {
help.add(queue.poll());
}
//然后把队列的最后一个元素添加到res中
int res = queue.poll();
swap();
return res;
}
//交换引用,目的就是,都能重复使用是Data队列往help队列里放值,并留下最后一个数留着返回
private void swap() {
Queue<Integer> tmp = help;
help = queue;
queue = tmp;
}
}
二、只利用栈来实现队列
因为栈是先进后出的,队列是先进先出的,所以也可以利用两个栈区实现队列这种数据结构就是先把数据放到push栈里,再把push栈里的数据倒入pop栈里,出栈只从pop栈里出,这样就实现了两个栈完成队列的功能,但是要注意的是,当pop中有数据的时候千万不要从push往pop栈里倒数据,因为数据顺序会出现问题,第二要满足push栈有数据一定一下倒完。
/*
* 实现使用栈来完成队列的操作
*/
public static class TwoStacksQueue {
private Stack<Integer> stackPush;
private Stack<Integer> stackPop;
public TwoStacksQueue() {
stackPush = new Stack<Integer>();
stackPop = new Stack<Integer>();
}
public void push(int pushInt) {
stackPush.push(pushInt);
dao();
}
public int poll() {
if (stackPop.empty() && stackPush.empty()) {
throw new RuntimeException("Queue is empty!");
} else if (stackPop.empty()) {
while (!stackPush.empty()) {
stackPop.push(stackPush.pop());
}
}
dao();
return stackPop.pop();
}
public int peek() {
if (stackPop.empty() && stackPush.empty()) {
throw new RuntimeException("Queue is empty!");
} else if (stackPop.empty()) {
while (!stackPush.empty()) {
stackPop.push(stackPush.pop());
}
}
dao();
return stackPop.peek();
}
//满足当当pop栈没数据和push栈一次全倒的前提下把push栈的数据倒入pop栈中
public void dao(){
if(stackPush.isEmpty()){
while(!stackPop.isEmpty()){
stackPop.push(stackPush.pop());
}
}
}
}