一,兩個棧實現一個隊列。
解題思路:棧的特點是先進後出,隊列的特點是先進後出,所以可以把隊列1中的元素pop到隊列2中,隊列2再次取出的時候就可以了。
/**
* 兩個棧實現一個隊列:
* 思路:先將數據存到第一個棧裏,再將第一個棧裏的元素全部出棧到第二個棧,第二個棧出棧,即可達到先進先出
* 擴展:棧是Vector的一個子類,它實現了一個標準的後進先出的棧。
* 棧只定義了默認構造函數,用來創建一個空棧。 堆棧除了包括由Vector定義的所有方法,也定義了自己的一些方法。
* 常用方法:
* boolean empty(),測試堆棧是否爲空。
* Object peek(),查看堆棧頂部的對象,但不從堆棧中移除它。
* Object pop(),移除堆棧頂部的對象,並作爲此函數的值返回該對象。
* Object push(Object element),把項壓入堆棧頂部。
* int search(Object element),返回對象在堆棧中的位置,以 1 爲基數,棧頂的位置爲1。
*/
public class StackToQueen<T> {
private Stack<T> stack1 = new Stack<>();
private Stack<T> stack2 = new Stack<>();
/**
* 添加數據
* @param num
*/
public void add(T num){
stack1.push(num);
}
/**
* pop出數據
* @param
*/
public void poll(){
if(stack1.isEmpty() && stack2.isEmpty()){
return;
}
//將stack1的元素放入stack2
while (stack1.size() > 0){
stack2.push(stack1.pop());
}
return;
}
public T get(){
if(stack2.isEmpty()){
return null;
}
return stack2.pop();
}
public static void main(String[] args) {
StackToQueen<Integer> stackToQueen = new StackToQueen();
stackToQueen.add(1);
stackToQueen.add(2);
stackToQueen.add(3);
stackToQueen.add(4);
stackToQueen.add(5);
stackToQueen.poll();
System.out.print(stackToQueen.get());
System.out.print(stackToQueen.get());
System.out.print(stackToQueen.get());
System.out.print(stackToQueen.get());
System.out.print(stackToQueen.get());
}
}
二,兩個隊列實現一個棧。
解題思路:隊列一中除最後一個數外其餘的數全部導入隊列二後返回隊列一中的元素,然後對隊列二也是如此操作。
/**
* 兩個隊列實現一個棧
* 思路:隊列一中出最後一個數外其餘的數全部導入隊列二,然後返回隊列中的元素,然後對隊列二也是如此操作。
* Quenu的常用方法:
* poll() 獲取並移除此隊列的頭,如果此隊列爲空,則返回 null
* remove() 獲取並移除此隊列的頭,如果此隊列爲空,則拋出NoSuchElementException異常
*
* peek() 獲取隊列的頭但不移除此隊列的頭。如果此隊列爲空,則返回 null
* element() 獲取隊列的頭但不移除此隊列的頭。如果此隊列爲空,則將拋出NoSuchElementException異常
*
* offer() 將指定的元素插入此隊列(如果立即可行且不會違反容量限制),插入成功返回 true;否則返回 false。
* 當使用有容量限制的隊列時,offer方法通常要優於 add方法——add方法可能無法插入元素,而只是拋出一個 IllegalStateException異常
* add() 將指定的元素插入此隊列
*/
public class QueenToStack<T> {
Queue<T> queue1 = new LinkedList<>();
Queue<T> queue2 = new LinkedList<>();
//添加
public void push(T num){
queue1.offer(num);
}
//取出
public T pop(){
if (queue1.isEmpty() && queue2.isEmpty()) {
throw new RuntimeException("queue is empty");
}
if (!queue1.isEmpty() && queue2.isEmpty()) {
while (queue1.size() > 1) {
queue2.offer(queue1.poll());
}
return queue1.poll();
}
if (queue1.isEmpty() && !queue2.isEmpty()) {
while (queue2.size() > 1) {
queue1.offer(queue2.poll());
}
return queue2.poll();
}
return null;
}
public static void main(String[] args) {
QueenToStack<Integer> queenToStack = new QueenToStack();
queenToStack.push(1);
queenToStack.push(2);
queenToStack.push(3);
queenToStack.push(4);
queenToStack.push(5);
System.out.print(queenToStack.pop());
System.out.print(queenToStack.pop());
System.out.print(queenToStack.pop());
System.out.print(queenToStack.pop());
System.out.print(queenToStack.pop());
}
}