1. 程式人生 > 其它 >資料結構 LeetCode 232 用棧實現佇列

資料結構 LeetCode 232 用棧實現佇列

232.用棧實現佇列

 

 

 一、一開始沒想到好的做法,就用了三個棧去做到輸入輸出

程式碼:

 1 class MyQueue {
 2 public:
 3     stack<int>a;
 4     MyQueue() {
 5 
 6     }
 7 
 8     void push(int x) {
 9         a.push(x);
10 
11     }
12 
13     int pop() {
14         stack<int>b;
15         stack<int>temp = a;
16         while
(!temp.empty()) 17 { 18 b.push(temp.top()); 19 temp.pop(); 20 } 21 int ans = b.top(); 22 b.pop(); 23 while (!b.empty()) 24 { 25 temp.push(b.top()); 26 b.pop(); 27 } 28 a = temp; 29 return
ans; 30 } 31 32 int peek() { 33 stack<int>b; 34 stack<int>temp=a; 35 while (!temp.empty()) 36 { 37 b.push(temp.top()); 38 temp.pop(); 39 } 40 return b.top(); 41 42 } 43 44 bool empty() {
45 return a.empty(); 46 } 47 };

也AC了,時間複雜度也很低,只是多用了一個棧。

 

 

 二、

後面發現直接兩個棧,一個in棧存進來的,一個out棧存要出去的,每次有執行pop指令就從出out棧出去,如果out棧為空,就把in棧的元素都pop到out,所以一共有n個元素,總的也只是把n個元素從inpop到out,總的時間複雜度應該是n,也滿足了題目的進階要求:

 

 

 我的AC程式碼:

class MyQueue {
public:
    stack<int>in;
    stack<int>out;
    MyQueue() {

    }

    void push(int x) {
        in.push(x);
    }

    int pop() {
        int ans;
        if (!out.empty())
        {
            ans = out.top();
            out.pop();
        }
        else
        {
            while (!in.empty())
            {
                out.push(in.top());
                in.pop();
            }
            ans = out.top();
            out.pop();
        }
        return ans;
    }

    int peek() {
        int ans;
        if (!out.empty())
        {
            ans = out.top();
        }
        else
        {
            while (!in.empty())
            {
                out.push(in.top());
                in.pop();
            }
            ans = out.top();
        }
        return ans;
    }

    bool empty() {
        if (in.empty() && out.empty())
            return true;
        else
            return false;
    }
};