一.兩個棧實現一個隊列java
思路:全部元素進stack1,而後所有出stack1並進入stack2.實現隊列的先進先出即:若stack2非空,咱們須要的剛好再棧頂,出棧;若要給隊列添加元素,即先進sack1,要出隊時,若stack2不爲空就出棧,爲空時就把stack1所有進棧到stack2code
import java.util.Stack; /** * Created by smyhvae on 2015/9/9. */ public class Queue { private Stack<Integer> stack1 = new Stack<>();//執行入隊操做的棧 private Stack<Integer> stack2 = new Stack<>();//執行出隊操做的棧 //方法:給隊列增長一個入隊的操做 public void push(int data) { stack1.push(data); } //方法:給隊列正價一個出隊的操做 public int pop() throws Exception { if (stack2.empty()) {//stack1中的數據放到stack2以前,先要保證stack2裏面是空的(要麼一開始就是空的,要麼是stack2中的數據出完了),否則出隊的順序會亂的,這一點很容易忘 while (!stack1.empty()) { stack2.push(stack1.pop());//把stack1中的數據出棧,放到stack2中【核心代碼】 } } if (stack2.empty()) { //stack2爲空時,有兩種可能:一、一開始,兩個棧的數據都是空的;二、stack2中的數據出完了 throw new Exception("隊列爲空"); } return stack2.pop(); } public static void main(String[] args) throws Exception { Queue queue = new Queue(); queue.push(1); queue.push(2); queue.push(3); System.out.println(queue.pop()); queue.push(4); System.out.println(queue.pop()); System.out.println(queue.pop()); System.out.println(queue.pop()); } }
二.兩個隊列實現一個棧隊列
import java.util.ArrayDeque; import java.util.Queue; /** * Created by smyhvae on 2015/9/9. */ public class Stack { Queue<Integer> queue1 = new ArrayDeque<Integer>(); Queue<Integer> queue2 = new ArrayDeque<Integer>(); //方法:入棧操做 public void push(int data) { queue1.add(data); } //方法:出棧操做 public int pop() throws Exception { int data; if (queue1.size() == 0) { throw new Exception("棧爲空"); } while (queue1.size() != 0) { if (queue1.size() == 1) { data = queue1.poll(); while (queue2.size() != 0) { //把queue2中的所有數據放到隊列一中 queue1.add(queue2.poll()); return data; } } queue2.add(queue1.poll()); } throw new Exception("棧爲空");//不知道這一行的代碼是什麼意思 } public static void main(String[] args) throws Exception { Stack stack = new Stack(); stack.push(1); stack.push(2); stack.push(3); System.out.println(stack.pop()); System.out.println(stack.pop()); stack.push(4); } }