聲明:碼字不易,轉載請注明出處,歡迎文章下方討論交流。
前言:Java數據結構與算法專題會不定時更新,歡迎各位讀者監督。本篇介紹的是如何用兩個隊列實現棧的問題。這道題作為上一篇文章算法面試:棧實現隊列的方案的姊妹篇(也是一道思路拓展題),本文給出問題的解決思路和Java實現代碼。
首先定義兩個隊列分別為queue1和queue2。
1.大體思路:
隊列實現棧,棧的特點是后進的先出,我們可以讓元素入隊queue1,留下隊尾元素讓其他元素出隊,暫存到queue2中,然后讓queue1中剩下的元素出隊,即最后進的最先出來。
2.基本解決方案
按照上述的大體思路,我們給出解決方案:入棧和出棧都在queue1中完成,queue2只作為臨時中轉空間。
入棧 入隊queue1
出棧 除queue1隊尾的元素外將其他所有元素出隊queue1,再入隊queue2(中轉暫存),然后將queue1中的元素出隊(出棧)。最后一步,將暫存在queue2中的元素再倒回queue1中。
為描述清晰,請看下圖:
事實上,這個思路和用兩個棧實現隊列的方案1類似,都是第二個數據區作為暫存中轉,最后在倒回到第一個數據區。
3.改進后的方案
上述方案是一個基本的最容易想到的解決方案,但是仔細觀察會發現其并不完美:在每次出棧步驟中要把queue2中的元素倒回到queue1中,這個操作很累贅,能否優化一下,可不可以不用每次先出棧后倒回??下面給出改進后的方案
入棧:
兩個隊列全空:任選一個隊列讓元素入隊,此處規定queue1
兩個隊列一個空:讓元素入隊非空的隊列
注:不考慮兩個隊列全滿,因為本身沒意義
出棧: 將非空隊列中除最后入隊的元素之外的其他所有元素入隊到另外一個隊列中,然后出隊剩下的那個元素(后進來的先出去,完成出棧)
相比于基本方案,改進后的方案沒有了基本方案中的倒回操作,整個流程變得簡潔高效,下面給出改進方案的java代碼實現。
4.java代碼實現
public class Queues2Stack {
private ArrayQueue q1;
private ArrayQueue q2;
private int maxLength;
public Queues2Stack(int capacity){
maxLength = capacity;
q1 = new ArrayQueue(capacity);
q2 = new ArrayQueue(capacity);
}
public int getSize(){
return q1.getsize()+q2.getsize();
}
/**
* 入棧:
* @param element 入棧元素
* @return 入棧成功結果?
*/
public boolean push(int element){
if(getSize() == maxLength){ //隊列都滿,此情景無意義
return false;
}
if(q2.isEmpty()){
q1.put(element);
}else{
q2.put(element);
}
return true;
}
/**
* 出棧
* @return 出棧元素
*/
public Object pop(){
if(getSize()==0){
throw new IndexOutOfBoundsException("空棧,無元素可出棧");
}else{ //留非空隊列中最后一個元素,其他搬到空隊列中
if(q2.isEmpty()){
while(q1.getsize()>1) q2.put(q1.pull());
return q1.pull(); //出隊最后一個,實現后進先出
}else{
while(q2.getsize()>1) q1.put(q2.pull());
return q2.pull(); //出隊最后一個,實現后進先出
}
}
}
}
測試程序:
public class Queues2StackTest {
public static void main(String[] args) {
Queues2Stack s = new Queues2Stack(5);
s.push(1);
s.push(2);
s.push(3);
System.out.println(s.pop()); //返回3
s.push(4);
s.push(5);
System.out.println(s.pop()); //返回5
System.out.println(s.pop()); //返回4
System.out.println(s.pop()); //返回2
System.out.println(s.pop()); //返回1
System.out.println(s.pop()); //拋出異常:提示棧為空
}
}
本篇的姊妹篇請移步到之前的文章算法面試:棧實現隊列的方案
歡迎討論提問,覺得文章對您有用,請收藏點個贊 ^_^