コード ランダム レコーディング アルゴリズム トレーニング キャンプ 15 日目 10 | 理論的基礎、232. スタックを使用したキューの実装、225. キューを使用したスタックの実装

理論的根拠

キューは先入れ先出しであり、スタックは先入れ後出しです。

4 つの質問:

  1. スタックは C++ のコンテナですか?
  2. 使用するスタックは STL のどのバージョンに属しますか?
  3. 私たちが使用している STL ではスタックはどのように実装されているのでしょうか?
  4. stack はスタック空間を横断するためのイテレータを提供しますか?

スタックとキューは、STL (C++ 標準ライブラリ) の 2 つのデータ構造です。

スタックはプッシュやポップなどのインターフェイスを提供し、すべての要素は先入れ後出しルールに準拠する必要があるため、スタックは訪問関数もイテレータも提供しません。set や map とは異なり、すべての要素を走査するために iterator イテレータが提供されます。

スタックは、基礎となるコンテナーを使用してすべての作業を完了し、外部の世界に統合されたインターフェイスを提供します。基礎となるコンテナーはプラグ可能です (つまり、スタックの機能を実装するためにどのコンテナーを使用するかを制御できます)。

スタックの内部構造、スタックの基礎となる実装は、vector、deque、list のすべてが可能ですが、主に配列とリンク リストの基礎となる実装です。

232. スタックを使用したキューの実装

キューは先入れ先出しであり、スタックは先入れ後出しです。

以前に習ったことがあるのですが、ずっと忘れていました。ここで注意する必要があるのは、プッシュ、ポップ、トップの3つの概念であり、この3つの概念を理解していれば、以降の操作が可能になります。コードは次のようになります。

class MyQueue {
public:
    //首先声明两个栈,一个入栈一个出栈
    stack<int> in;
    stack<int> out;

    MyQueue() {

    }
    
    void push(int x) {
        //入栈过程
        in.push(x);

    }
    
    int pop() {
        //首先判断出栈是否为空
        while(out.empty())
        {
            //判断入栈是否为空,在不为空的情况下
            while(!in.empty())
            {
                out.push(in.top());
                in.pop();
            }
        }
        int result = out.top();
        out.pop();
        return result;

    }
    
    int peek() {
        int result1 = this->pop();
        out.push(result1);
        return result1;

    }
    
    bool empty() {
        return in.empty()&&out.empty();

    }
};

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue* obj = new MyQueue();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->peek();
 * bool param_4 = obj->empty();
 */

225. キューを使用したスタックの実装

要素をポップアップするプロセスでは、前の size()-1 をポップアウトし、後で追加します。

このコードは比較的単純で、一度実行すると正常に実行されます。

class MyStack {
public:

    //首先声明队列
    queue<int> que;

    MyStack() {

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

    }
    
    int pop() {
        int queSize = que.size();

        queSize = queSize - 1;//首先将数目减一操作

        while(queSize--)
        {
            que.push(que.front());
            que.pop();
        }

        int result = que.front();

        que.pop();

        return result;
    }
    
    int top() {

        return que.back();

    }
    
    bool empty() {
        return que.empty();
    }
};

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack* obj = new MyStack();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->top();
 * bool param_4 = obj->empty();
 */

おすすめ

転載: blog.csdn.net/m0_47489229/article/details/131002490