1. 程式人生 > >兩個棧實現一個佇列/兩個佇列實現一個棧

兩個棧實現一個佇列/兩個佇列實現一個棧

1兩個棧實現一個佇列

1.原理分析:

佇列的主要操作有兩個:入隊操作和出隊操作,出隊時從隊頭出,入隊是從隊尾插入,入隊的操作和入棧的操作類似,而最關鍵的問題是出隊操作,要出佇列的是佇列的第一個元素,而出棧的是棧的棧頂元素,所以我們可以這樣:

       假設兩個棧A和棧B,A主要用來處理入隊操作,B用於處理出隊操作。入隊操作和入棧操作類似,直接將元素壓入棧即可。出隊的時候,實現我們假設棧B為空,則要把棧A的第一個元素(即棧底元素)彈出,直接從A彈出這是不可能的,但如果我們把棧A裡面的元素的順序逆過來,這樣直接用棧彈出棧頂元素即可,所以我們可以把棧A的元素全部彈出來,並俺順序壓入棧B中,這樣每次棧B彈出的棧頂元素就是棧A相對應的棧底元素,就是出隊操作。若B不為空,則代表之前從A複製過來的元素還沒有完全彈出,要出棧的時候直接彈出即可。若棧B的元素都彈出來了,就需要從A中補充。

 2.總結操作就是:    

入隊:將元素進棧A

出隊:判斷棧B是否為空,如果為空,則將棧A中所有元素pop,並push進棧B,棧B出棧;如果不為空,棧B直接出棧。

3.Java程式碼實現

  1. import java.util.Stack;  
  2. publicclass StacksToQueue   
  3. {  
  4.      Stack<Integer> stack1=new Stack<Integer>() ;  
  5.      Stack<Integer> stack2=new Stack<Integer>();  
  6.      public
    void addToTail(int x)//新增元素到隊尾   --進隊---
  7.      {  
  8.          stack1.push(x);  
  9.      }  
  10.      publicint deleteHead()//刪除對首      --出隊---    不需是隊不為空才能刪除呀~~~~
  11.      {  
  12.          if( pSize()!=0)//佇列不為空
  13.          {  
  14.              if(stack2.isEmpty())//若stack2為空,則把stack1全部加入stack2
  15.                  stack1ToStack2();   
  16.              return
      stack2.pop();  
  17.          }  
  18.          else
  19.          {  
  20.              System.out.println("佇列已經為空,不能執行從隊頭出隊");  
  21.              return -1;  
  22.          }  
  23.      }  
  24.      publicvoid stack1ToStack2()//把stack1全部放入stack2
  25.      {  
  26.          while(!stack1.isEmpty())   
  27.              stack2.push(stack1.pop());  
  28.      }  
  29.      publicint pSize()//佇列size()
  30.      {  
  31.          return  stack1.size()+stack2.size();//兩個都為空佇列才是空
  32.      }  
  33. }    

2兩個佇列實現一個棧

1.原理分析: 棧的主要操作有兩個:入棧操作和出棧操作,出棧時從棧頂出,入棧是從棧頂插入。入棧和入隊類似,都是從“所有元素後面插入”;而最關鍵的問題是出棧操作,要出棧的是的棧頂元素,而佇列每次出隊的是佇列的第一個元素。因此我們可以這樣,出隊的時候,若佇列不止一個元素,則進行出隊 操作,只保留最後一個元素,這樣出隊的時候,就符合出棧的要求了,但其他的元素必須 保留,而且順序不能亂,這時候另一個佇列就起作用了,這個佇列可以在“出棧”操作之前按順序保留所有的元素,等到“出棧”之後,把所有元素按順序進入到“出棧”後的佇列。因此兩個佇列總有一個為空。
2.總結操作就是:

入棧:將元素進佇列A

出棧:判斷佇列A中元素的個數是否為1,如果等於1,則出佇列,否則將佇列A中的元素  以此出佇列並放入佇列B,直到佇列A中的元素留下一個,然後佇列A出佇列,再把  佇列B中的元素出佇列以此放入佇列A中。


3.Java程式碼實現:
  1. import java.util.LinkedList;  
  2. publicclass QueuesToStack   
  3. {  
  4.     LinkedList<Integer> queue1=new LinkedList<Integer>();  
  5.     LinkedList<Integer> queue2=new LinkedList<Integer>();  
  6.     publicvoid push(int value)//入棧
  7.     {  
  8.         queue1.addLast(value);  
  9.     }  
  10.     publicint pop()//出棧     必須是非空的棧才能出棧啊
  11.     {  
  12.         if(sSize()!=0)//棧不為空
  13.         {  
  14.             //移動一個隊的n-1個到另一箇中
  15.             if(!queue1.isEmpty())//q1 空
  16.             {  
  17.                 putN_1ToAnthor();  
  18.                 return queue1.removeFirst();  
  19.             }  
  20.             else//q2 空
  21.             {  
  22.                 putN_1ToAnthor();  
  23.                 return queue2.removeFirst();  
  24.             }          
  25.         }  
  26.         else
  27.         {  
  28.             System.out.println("棧已經為空啦,不能出棧");  
  29.             return -1;  
  30.         }  
  31.     }  
  32.     publicint sSize()  
  33.     {  
  34.         return queue1.size()+queue2.size();  
  35.     }  
  36.     publicvoid putN_1ToAnthor()//從非空中出隊n-1個到另一個佇列   因為佇列總是一空一非空
  37.     {  
  38.         if(!queue1.isEmpty())  
  39.         {  
  40.             while(queue1.size()>1)  
  41.             {  
  42.                 queue2.addLast(queue1.removeFirst());  
  43.             }  
  44.         }  
  45.         elseif(!queue2.isEmpty())  
  46.         {  
  47.             while(queue2.size()>1)  
  48.             {  
  49.                 queue1.addLast(queue2.removeFirst());  
  50.             }  
  51.         }  
  52.     } 
  53. }

相關推薦

面試題9-用實現一個佇列,完成佇列的Push和Pop操作

題目 用兩個棧來實現一個佇列,完成佇列的Push和Pop操作。 佇列中的元素為int型別。 思路: 一個棧壓入元素,而另一個棧作為緩衝,將棧1的元素出棧後壓入棧2中 程式碼  import java.util.Stack;

實現一個佇列,完成佇列的Push和Pop操作。

劍指offer程式設計題 用兩個棧來實現一個佇列,完成佇列的Push和Pop操作。 思路:由於佇列是先進先出的,而棧是先進後出的,所以要用2個棧來實現佇列的入隊出隊功能,佇列的入隊功能與棧的一樣,出隊時,先將第一個棧中的元素全部彈出,並倒入到第二個棧中,將第二個棧中棧頂元素彈出,

實現一個佇列 佇列實現一個

棧和佇列實現的程式碼在連結中的部落格https://blog.csdn.net/Damn_Yang/article/details/83928852 兩個棧實現一個佇列  思路:            入隊時,直接壓入

實現一個佇列,完成佇列的Push和Pop操作。 佇列中的元素為int型別。

class Solution { Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stack2 = new Stack<Integer>(

C++:用實現一個佇列,完成佇列的Push和Pop操作

problem用兩個棧來實現一個佇列,完成佇列的Push和Pop操作。 佇列中的元素為int型別。analysisclass Solution { public: void push(int node) { stack1.push(node);

實現一個佇列/佇列實現一個

1兩個棧實現一個佇列 1.原理分析: 佇列的主要操作有兩個:入隊操作和出隊操作,出隊時從隊頭出,入隊是從隊尾插入,入隊的操作和入棧的操作類似,而最關鍵的問題是出隊操作,要出佇列的是佇列的第一個元素,而出棧的是棧的棧頂元素,所以我們可以這樣:        假設兩個棧A和棧B

佇列(Queue)實現一個(Stack)

class Stack2 { private Queue<int> q1; private Queue<int> q2;

一:用實現佇列

/** * 題目:用兩個棧實現佇列 * 描述:用兩個棧來實現一個佇列,完成佇列的Push和Pop操作。 佇列中的元素為int型別。 * 解決方案:方法一:一個作為儲存用,一個作為彈出用 * */ public class One { Stack

演算法導論(第三版)練習 10.1-1 ~ 10.1-7 實現佇列 佇列實現

棧與佇列js實現版本: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title>

實現佇列&&佇列實現

//首先兩個棧實現佇列 import java.util.Stack; public class Solution { Stack<Integer> stack1 = new Stack<Integer>(); Stack<I

劍指Offer(java+第七題,實現佇列+佇列實現

兩個棧實現佇列: import java.util.Stack; public class Offer07 { private static Stack<Object> stack1 = new Stack<>(); private static Stac

實現佇列-佇列實現

1、兩個棧實現佇列 import java.util.Stack; public class Solution { Stack<Integer> stack1 = new Stack<Integer>(); Stack&l

經典面試題:實現佇列+佇列實現----java

兩個棧實現佇列+兩個佇列實現棧—-java 一.兩個棧實現一個佇列 思路:所有元素進stack1,然後全部出stack1並進入stack2.實現佇列的先進先出即:若stack2非空,我們需要的恰好再棧頂,出棧;若要給佇列新增元素,即先進sack1,要出隊時,

9. 3 行 3 列的矩陣,實現其對應位置的數據相加,並返回一個新矩陣

int nco utf print odin enc odi nbsp bsp X = [[12,7,3], [4 ,5,6], [7 ,8,9]] Y = [[5,8,1], [6,7,3], [4,5,9]] #encoding=

javascript操作選擇列表(有列表,如何實現一個列表通過雙擊和多選列表中內容新增到另一個列表. )

</script></head><body><table width='500' border='1' cellpadding='0' cellspacing='0'><tr><td width='45%' align="center">

STM8L EXITB一個中斷的實現

void EXTI_Config(void) {      EXTI_DeInit();        EXTI_SetPinSensitivity(EXTI_Pin_5,EXTI_Trigger_Falling);      ITC_SetSoftwarePriority

使用RecyclerView實現QQ空間廣告位一個位置圖時偶遇bug

前段時間就發現手機qq空間內,在動態中插入的廣告在滑動的時候有貓膩(一個位置來回切換兩張廣告圖),一直想要去實現這個效果,但是一直都沒有時間去研究,昨天刷空間的時候就又看到了這個效果,所以就在網上找了個帖子在午飯時間研究了一下,不是很複雜,就敲了敲,練了練手。結果執行的時候

Android 一個按鈕次單擊觸發不同事件並實現View在同一介面切換

MenuText.java] package com.lskl.com; import android.app.Activity; import android.os.Bundle; import android.view.View; import andro

非遞減的有序連結串列合併為一個非遞增的有序連結串列(C語言程式設計實現

將兩個非遞減的有序連結串列合併為一個非遞增的有序連結串列。要求結果連結串列仍使用原來兩個連結串列的儲存空間, 不另外佔用其它的儲存空間。表中允許有重複的資料。 #include<stdio.

淺談種方法實現瀏覽器內多標簽頁之間的通信

tools view -s data- oca microsoft oar art set 調用localstorge、cookies等本地存儲方式。 方法一: localstorge在一個標簽頁裏被添加、修改或刪除時,都會觸發一個storage事件,通過在另一個標簽頁裏監