使用兩個隊列實現一個棧


如圖所示,我們先往棧內壓入一個元素a。由於兩個隊列現在都是空,我們可以選擇把a插入兩個隊列中的任一個。我們不妨把a插入queue1。接下來繼續網棧內壓入b,c兩個元素。我們把它們都插入queue1。這個時候 queue1包含3個元素a,b,c其中a位於隊列的頭部,c位於隊列的尾部。

現在我們考慮從棧內彈出一個元素。根據棧的后入先出的原則,最后被壓入棧的c應該最先被彈出。由於c位於queue1的尾部,而我們每次只能從隊列的頭部刪除元素,因此我們可以從queueu中依次刪除a/b/c並插入到queue2中,再從queue1中刪除c。這就相當於從棧中彈出元素c了。我們可以用同樣的方法從棧內彈出元素b。

接下來我們考慮從棧內壓入一個元素d.此時queue1已經有了一個元素,我們就把d插入到queue1的尾部。如果我們再從棧內彈出一個元素,此時被彈出的應該是最后被壓入的d.由於d位於queue1的尾部,我們只能先從頭部刪除 queue1的元素並插入到queue2,直到queue1中遇到d再直接把它刪除。如果所示:

import java.util.LinkedList;

public class StackByTwoQueue {
    
    private LinkedList<String> queue1 = new LinkedList<String>();
    private LinkedList<String> queue2 = new LinkedList<String>();
    
    /*
     * 兩個隊列實現一個棧
     * pop完成出棧操作,push完成入棧操作
     */
    public void push(String obj) {
        if(queue1.isEmpty()){
            queue2.add(obj);
        }
        if(queue2.isEmpty()){
            queue1.add(obj);
        }
    }
    public String pop() {
        //兩個棧都為空時,沒有元素可以彈出
        if (queue1.isEmpty()&&queue2.isEmpty()) {
            try {
                throw new Exception("stack is empty");
            } catch (Exception e) {
            }
        }
        if(queue1.isEmpty()){
            while(queue2.size()>1){
                queue1.add(queue2.poll());
            }
            return queue2.poll();
        }
        if(queue2.isEmpty()){
            while(queue1.size()>1){
                queue2.add(queue1.poll());
            }
            return queue1.poll();
        }
        return null;
    }
    
    public static void main(String[] args) {
        StackByTwoQueue stack = new StackByTwoQueue();
        for(int i=0;i<10;i++){
            stack.push(i+"");
        }
        for(int i=0;i<20;i++){
            System.out.println(stack.pop());
        }
    }
    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM