LeetCode225. 用佇列實現棧

Tomorrowland_D發表於2024-07-24

LeetCode題目連結:https://leetcode.cn/problems/implement-stack-using-queues/description/

題目敘述:

請你僅使用兩個佇列實現一個後入先出(LIFO)的棧,並支援普通棧的全部四種操作(push、top、pop 和 empty)。

實現 MyStack 類:

void push(int x) 將元素 x 壓入棧頂。
int pop() 移除並返回棧頂元素。
int top() 返回棧頂元素。
boolean empty() 如果棧是空的,返回 true ;否則,返回 false 。
 

注意:

你只能使用佇列的標準操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 這些操作。
你所使用的語言也許不支援佇列。 你可以使用 list (列表)或者 deque(雙端佇列)來模擬一個佇列 , 只要是標準的佇列操作即可。
 

示例:

輸入:
["MyStack", "push", "push", "top", "pop", "empty"]
[[], [1], [2], [], [], []]
輸出:
[null, null, null, 2, 2, false]

解釋:
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False
 

提示:

1 <= x <= 9
最多呼叫100 次 push、pop、top 和 empty
每次呼叫 pop 和 top 都保證棧不為空

思路:

其實這道題目就是用一個佇列就夠了。

一個佇列在模擬棧彈出元素的時候只要將佇列頭部的元素(除了最後一個元素外),重新新增到佇列尾部,此時再去彈出元素就是棧的順序了。

思路很清晰,模擬彈出棧的元素時,只需要計算佇列中的元素個數size,然後彈出size-1個元素以後,再彈出佇列的首元素,就可以達到我們的目標了

top()函式更加方便,只需要返回佇列的隊尾元素即可,即que.back()。就可以達到模擬返回棧的頂部的元素了。

C++程式碼如下:

class MyStack {
public:
    queue<int> que;
    MyStack() {

    }
    void push(int x) {
        que.push(x);
    }
    
    int pop() {
        int size=que.size();
        size--;
        //迴圈佇列的總元素個數-1次
        while(size--){
            que.push(que.front());
            que.pop();
        }
        int result=que.front();
        que.pop();
        return result;
    }
    int top() {
        int res=que.back();
        return res;
    }
    bool empty() {
        return que.empty();
    }
};

相關文章