兩個棧實現隊列+兩個隊列實現棧----java
一.兩個棧實現一個隊列
思路:所有元素進stack1,然後全部出stack1並進入stack2.實現隊列的先進先出即:若stack2非空,我們需要的恰好再棧頂,出棧;若要給隊列添加元素,即先進sack1,要出隊時,若stack2不爲空就出棧,爲空時就把stack1全部進棧到stack2
package com.sheepmu;
import java.util.Stack;
public class StacksToQueue
{
Stack<Integer> stack1=new Stack<Integer>() ;
Stack<Integer> stack2=new Stack<Integer>();
public void addToTail(int x)//添加元素到隊尾 --進隊---
{
stack1.push(x);
}
public int deleteHead()//刪除對首 --出隊--- 不需是隊不爲空才能刪除呀~~~~
{
if( pSize()!=0)//隊列不爲空
{
if(stack2.isEmpty())//若stack2爲空,則把stack1全部加入stack2
stack1ToStack2();
return stack2.pop();
}
else
{
System.out.println("隊列已經爲空,不能執行從隊頭出隊");
return -1;
}
}
public void stack1ToStack2()//把stack1全部放入stack2
{
while(!stack1.isEmpty())
stack2.push(stack1.pop());
}
public int pSize()//隊列size()
{
return stack1.size()+stack2.size();//兩個都爲空隊列纔是空
}
public static void main(String[] args)
{
StacksToQueue q=new StacksToQueue ();
q.addToTail(1);
q.addToTail(2);
q.addToTail(3);
q.addToTail(4);
System.out.println(q.deleteHead());
System.out.println(q.deleteHead());
q.addToTail(5);
System.out.println(q.deleteHead());
System.out.println(q.deleteHead());
System.out.println(q.deleteHead());
System.out.println(q.deleteHead());
}
}
輸出:
1
2
3
4
5
隊列已經爲空,不能執行從隊頭出隊
-1
二.兩個隊列實現一個棧
思路:所有元素進入q1,因爲我們的目的是棧,也就是最先出c,兒隊是從隊頭開始出,所有先把ab出q1併入q2,此時目標c跑到了隊頭,出q1。此時q1已經爲空,下一個要出的是b,把a從q2出隊並進q1,此時目標b在q2隊頭,出隊........
即:把非空隊列的n-1個壓人空對列,剩的第n個出隊...即總有一個隊列爲空。
ps:圖片原創於劍橋offer,來自網絡
package com.sheepmu;
import java.util.LinkedList;
public class QueuesToStack
{
LinkedList<Integer> queue1=new LinkedList<Integer>();
LinkedList<Integer> queue2=new LinkedList<Integer>();
public void push(int value)//入棧
{
queue1.addLast(value);
}
public int pop()//出棧 必須是非空的棧才能出棧啊
{
if(sSize()!=0)//棧不爲空
{
//移動一個隊的n-1個到另一箇中
if(!queue1.isEmpty())//q1 空
{
putN_1ToAnthor();
return queue1.removeFirst();
}
else //q2 空
{
putN_1ToAnthor();
return queue2.removeFirst();
}
}
else
{
System.out.println("棧已經爲空啦,不能出棧");
return -1;
}
}
public int sSize()
{
return queue1.size()+queue2.size();
}
public void putN_1ToAnthor()//從非空中出隊n-1個到另一個隊列 因爲隊列總是一空一非空
{
if(!queue1.isEmpty())
{
while(queue1.size()>1)
{
queue2.addLast(queue1.removeFirst());
}
}
else if(!queue2.isEmpty())
{
while(queue2.size()>1)
{
queue1.addLast(queue2.removeFirst());
}
}
}
public static void main(String[] args)
{
QueuesToStack stack=new QueuesToStack();
stack.push(1);
stack.push(2);
stack.push(3);
stack.push(4);
System.out.println(stack.pop());
System.out.println(stack.pop());
stack.push(5);
stack.push(6);
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
}
}
輸出:
4
3
6
5
2
1
棧已經爲空啦,不能出棧
-1