6.用兩個棧實現一個隊列,實現隊列的兩個函數appendTail和deleteHead,分別完成在隊列尾部插入節點在隊列頭部刪除節點的操作。
首先插入一個元素1,2,3,4,不妨先把它插入到stack1,此時stack1 中的元素有{4,3,2,1},stack2爲空。此時4位於棧頂位置而stack2仍然爲空。
這個時候,我們試着刪除從隊列中刪除一個元素。按照隊列先進先出的規則,由於1比2,3,4先插入到隊列中,最先被刪除的元素應該是1。元素1存儲在stack1中,但並不在棧頂上,因此不能直接被刪除。注意到stack2我們還一直沒有使用過,現在是讓stack2發揮作用的時候了。如果我們把stack1中的元素逐個彈出並壓入stack2,元素在stack2中的順序正好和原來的stack1中的順序相反。因此經過4次彈出stack1和壓入stack2操作之後,stack1爲空,而stack2中的元素是{1,2,3,4},這個時候就可以彈出stack2的棧頂1了。此時的stack1爲空,而stack2的元素爲{2,3,4},緊接着再刪除元素2,再次插入元素5時,5先放入stack1中,再依次刪除隊列中的元素3,4當刪除到5時stack2又爲空,所以先將stack1中的5彈出並壓入stack2中再次彈出。
import java.util.LinkedList;
import java.util.Stack;
public class javatest
{
LinkedList<Integer> stack1=new LinkedList<Integer>() ;//插入棧
Stack<Integer> stack2=new Stack<Integer>();//彈出棧
public void appendTail(int x)//添加元素到隊尾 --進隊---
{
stack1.add(x);
System.out.println("進入隊列元素爲:"+x);
}
public int deleteHead()//刪除隊首 --出隊--- 必須是隊不爲空才能刪除呀~~~~
{
if( pSize()!=0)//隊列不爲空
{
if(stack2.isEmpty())//若stack2爲空,則把stack1全部加入stack2
stack2.push(stack1.pop());
return stack2.pop();
}
else
{
System.out.println("隊列已經爲空,不能執行從隊頭出隊");
return 0;
}
}
public int pSize() //隊列size()
{
return stack1.size()+stack2.size();//兩個都爲空隊列纔是空
}
public static void main(String[] args)
{
javatest q=new javatest ();
q.appendTail(1);
q.appendTail(2);
q.appendTail(3);
q.appendTail(4);
System.out.println("刪除元素爲:"+q.deleteHead());
System.out.println("刪除元素爲:"+q.deleteHead());
q.appendTail(5);
System.out.println("刪除元素爲:"+q.deleteHead());
System.out.println("刪除元素爲:"+q.deleteHead());
System.out.println("刪除元素爲:"+q.deleteHead());
System.out.println("刪除元素爲:"+q.deleteHead());
System.out.println("刪除元素爲:"+q.deleteHead());
}
}
輸出結果:
進入隊列元素爲:1
進入隊列元素爲:2
進入隊列元素爲:3
進入隊列元素爲:4
刪除元素爲:1
刪除元素爲:2
進入隊列元素爲:5
刪除元素爲:3
刪除元素爲:4
刪除元素爲:5
隊列已經爲空,不能執行從隊頭出隊
刪除元素爲:0
隊列已經爲空,不能執行從隊頭出隊
刪除元素爲:0