public class Test07 {
/**
* 用兩個棧實作一個隊列(先進後出)
* 隊列的聲明如下:實作它的兩個函數appendTail(隊列尾部插入結點)和deleteHead(隊列頭部删除結點)
*/
public static class MyQueue<T> {
private Stack<T> stack1 = new Stack<>();
private Stack<T> stack2 = new Stack<>();
public MyQueue() {
super();
}
/**
* 隊列尾部插入結點
*
* @param t
*/
public void appendTail(T t) {
stack1.push(t);
}
/**
* 隊列頭部删除結點
*
* @return
*/
public T deleteHead() {
//先判斷彈出棧是否為空,如果為空就将插入棧的所有資料彈出棧,
//并且将彈出的資料壓入彈出棧中
if (stack2.isEmpty()) {
while (!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
}
if (stack2.isEmpty()) {
throw new RuntimeException("queue is empty.");
}
return stack2.pop();
}
}
/**
* 用兩個隊列實作一個棧(先進後出)
* 棧的聲明如下:實作它的兩個函數appendTail(棧頂插入結點)和deleteHead(棧頂删除結點)
*/
public static class MyStack<T> {
private Queue<T> queue1 = new LinkedBlockingQueue<>();
private Queue<T> queue2 = new LinkedBlockingQueue<>();
public MyStack() {
super();
}
/**
* 棧頂插入結點
*
* @param t
* @return
*/
public boolean appendTail(T t) {
return queue1.add(t);
}
/**
* 棧頂删除結點
*
* @return
*/
public T deleteHead() {
if (queue1.isEmpty() && queue2.isEmpty()) {
throw new RuntimeException("stack is empty.");
}
//queue2不為空,把queue2的資料放入queue1中,直到queue2隻剩下一個元素,彈出
if (queue1.isEmpty()) {
while (queue2.size() > 1) {
queue1.add(queue2.poll());
}
return queue2.poll();
}
//queue1不為空,把queue1的資料放入queue2中,直到queue1隻剩下一個元素,彈出
if (queue2.isEmpty()) {
while (queue1.size() > 1) {
queue2.add(queue1.poll());
}
return queue1.poll();
}
return null;
}
}
public static void main(String[] args) throws InterruptedException {
MyQueue<Integer> myQueue = new MyQueue<>();
myQueue.appendTail(1);
myQueue.appendTail(2);
myQueue.appendTail(3);
myQueue.appendTail(4);
System.out.println(myQueue.deleteHead());
System.out.println(myQueue.deleteHead());
System.out.println(myQueue.deleteHead());
System.out.println(myQueue.deleteHead());
MyStack<Integer> myStack = new MyStack<>();
myStack.appendTail(1);
myStack.appendTail(2);
myStack.appendTail(3);
myStack.appendTail(4);
System.out.println(myStack.deleteHead());
System.out.println(myStack.deleteHead());
System.out.println(myStack.deleteHead());
System.out.println(myStack.deleteHead());
}
}