兩個棧實現隊列

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章