用连个栈实现一个队列,要求队列有删除头和在尾部加入元素的功能
思路
因为栈是先进后出,队列是先进先出的特点,所以入队列的时候,进入A栈,删除或者出对列的时候,将A栈中的元素依次压入栈B,然后在依次弹出,就实现了先进先出的效果
代码实现
package com.tangbaobao.offer;
import org.junit.Test;
import java.util.Stack;
/**
* 用两个栈实现队列
*
* 在Java自带的栈结构上进行封装
*
* @author 唐学俊
* @create 2018/04/02
**/
public class Test8 {
private Stack<String> stackA = new Stack<>();
private Stack<String> stackB = new Stack<>();
@Test
public void fun1() {
//添加元素
this.appendTail("a");
this.appendTail("b");
this.appendTail("c");
//扫描
this.sacnQueue();
//删除头元素
this.deleteHead();
this.sacnQueue();
//加入尾元素
this.appendTail("d");
this.sacnQueue();
}
/**
* 在尾部添加元素
*/
public void appendTail(String n) {
//如果stackB为空,则直接将元素加入
if(!stackB.empty()){
//否则先将stackB中的元素压入stack A中,然后加入
while (!stackB.empty()){
stackA.push(stackB.pop());
}
}
stackA.push(n);
}
/**
* 删除头
*/
public String deleteHead() {
//如果B不为空,则弹出B中的第一个元素
if (!stackB.empty()) {
return stackB.pop();
} else {
//如果B为空,如果A不为空,则将A弹出,压入B,再弹出
if (!stackA.empty()) {
while (!stackA.empty()) {
stackB.push(stackA.pop());
}
return stackB.pop();
//否则抛出异常
} else {
try {
throw new Exception("队列中没有元素");
} catch (Exception e) {
e.printStackTrace();
}
}
}
return null;
}
/**
* 遍历队列
*/
public void sacnQueue() {
//每次保证A中的都已经入栈b
while (!stackA.empty()) {
stackB.push(stackA.pop());
}
//遍历
stackB.forEach(x -> System.out.print(x + " "));
System.out.println();
}
}