用佇列實現棧

go__Ahead發表於2024-03-10

力扣225. 用佇列實現棧

思路:主要是出棧操作,可以使用兩個佇列,出棧時將入棧佇列中資料壓入輔助佇列中,直到入棧佇列只剩下一個資料就是棧頂元素,然後再把輔助佇列中元素全部壓回入棧佇列中,清空輔助佇列

public:
    queue<int> que1;
    queue<int> que2;
    MyStack() {

    }
    
    void push(int x) {
        que1.push(x);
    }
    
    int pop() {
        while(que1.size()!=1){
            que2.push(que1.front());
            que1.pop();
        }
        int result = que1.front();
        que1.pop();

        // while(!que2.empty()){
        //     que1.push(que2.front());
        //     que2.pop();
        // }

        que1 = que2;            // 再將que2賦值給que1
        while (!que2.empty()) { // 清空que2
            que2.pop();
        }
        
        return result;
    }
	
    int top() {
        return que1.back();;
    }
    
    bool empty() {
        return que1.empty();
    }
};

最佳化,其實只需要一個佇列就能實現,出棧時只需將元素壓入佇列尾部

class MyStack {
public:
    queue<int> que;
    /** Initialize your data structure here. */
    MyStack() {

    }
    /** Push element x onto stack. */
    void push(int x) {
        que.push(x);
    }
    /** Removes the element on top of the stack and returns that element. */
    int pop() {
        int size = que.size();
        size--;
        while (size--) { // 將佇列頭部的元素(除了最後一個元素外) 重新新增到佇列尾部
            que.push(que.front());
            que.pop();
        }
        int result = que.front(); // 此時彈出的元素順序就是棧的順序了
        que.pop();
        return result;
    }

    /** Get the top element. */
    int top() {
        return que.back();
    }

    /** Returns whether the stack is empty. */
    bool empty() {
        return que.empty();
    }
};

相關文章