兩個棧實現一個佇列/兩個佇列實現一個棧
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程式碼實現
- import java.util.Stack;
- publicclass StacksToQueue
- {
- Stack<Integer> stack1=new Stack<Integer>() ;
- Stack<Integer> stack2=new Stack<Integer>();
-
public
- {
- stack1.push(x);
- }
- publicint deleteHead()//刪除對首 --出隊--- 不需是隊不為空才能刪除呀~~~~
- {
- if( pSize()!=0)//佇列不為空
- {
- if(stack2.isEmpty())//若stack2為空,則把stack1全部加入stack2
- stack1ToStack2();
-
return
- }
- else
- {
- System.out.println("佇列已經為空,不能執行從隊頭出隊");
- return -1;
- }
- }
- publicvoid stack1ToStack2()//把stack1全部放入stack2
- {
- while(!stack1.isEmpty())
- stack2.push(stack1.pop());
- }
- publicint pSize()//佇列size()
- {
- return stack1.size()+stack2.size();//兩個都為空佇列才是空
- }
- }
2兩個佇列實現一個棧
1.原理分析: 棧的主要操作有兩個:入棧操作和出棧操作,出棧時從棧頂出,入棧是從棧頂插入。入棧和入隊類似,都是從“所有元素後面插入”;而最關鍵的問題是出棧操作,要出棧的是的棧頂元素,而佇列每次出隊的是佇列的第一個元素。因此我們可以這樣,出隊的時候,若佇列不止一個元素,則進行出隊 操作,只保留最後一個元素,這樣出隊的時候,就符合出棧的要求了,但其他的元素必須 保留,而且順序不能亂,這時候另一個佇列就起作用了,這個佇列可以在“出棧”操作之前按順序保留所有的元素,等到“出棧”之後,把所有元素按順序進入到“出棧”後的佇列。因此兩個佇列總有一個為空。2.總結操作就是:
入棧:將元素進佇列A
出棧:判斷佇列A中元素的個數是否為1,如果等於1,則出佇列,否則將佇列A中的元素 以此出佇列並放入佇列B,直到佇列A中的元素留下一個,然後佇列A出佇列,再把 佇列B中的元素出佇列以此放入佇列A中。
3.Java程式碼實現:
- import java.util.LinkedList;
- publicclass QueuesToStack
- {
- LinkedList<Integer> queue1=new LinkedList<Integer>();
- LinkedList<Integer> queue2=new LinkedList<Integer>();
- publicvoid push(int value)//入棧
- {
- queue1.addLast(value);
- }
- publicint 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;
- }
- }
- publicint sSize()
- {
- return queue1.size()+queue2.size();
- }
- publicvoid putN_1ToAnthor()//從非空中出隊n-1個到另一個佇列 因為佇列總是一空一非空
- {
- if(!queue1.isEmpty())
- {
- while(queue1.size()>1)
- {
- queue2.addLast(queue1.removeFirst());
- }
- }
- elseif(!queue2.isEmpty())
- {
- while(queue2.size()>1)
- {
- queue1.addLast(queue2.removeFirst());
- }
- }
- }
- }
相關推薦
面試題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事件,通過在另一個標簽頁裏監