スタックとLIFO構造体:実装とユースケース

これらの重要なメソッドについて説明した後、Stackクラスの最終的な実装を見てみましょう:

pushメソッドとpopメソッドは、期待どおりに表示されます(lines13–32)。 Pushメソッドを使用して、いくつかの可変長値(7-11行目)を持つカスタム初期化子を作成できます。 さらに、rootNodeに値(34-36行目)があるかどうかを確認し、次のプロパティ(38-44行目)を介してノードにアクセスできる限り、リストを反復処理する基本的なprintメソッ

スタック機能の基本的なテストは次のようになります:

スタックを実装する方法を知ることは一つのことですが、さらに重要なのは、スタックが適している状況を認識することです。 この次のセクションでは、そのような3つのケースを見ていきます。

ユースケース1: 逆順

スタックの順序は固定されているため、あるスタックから要素をすぐに別のスタックにポップすることで、逆順を非常に簡単に達成できます。 インデックスの交換をいじりません!

ユースケース2:対称性のテスト

スタックのもう一つの良いユースケースは、対称性のテストです。 以下の例では、括弧の文字列をテストして、各閉じ括弧が以前の開いている括弧と正しい対応するものであることを確認しています。

まず、奇数の文字がすぐに非対称になるように、文字数が2で割り切れることを確認します(6行目)。 次に、不正な文字の文字セットを定義し、入力文字列に不正な文字のnil範囲(7-8行目)があることを確認することで、有効な入力があることを確認しま 閉じ括弧と開き括弧が一致していることを確認するために、それらをキーと値のペアとして辞書に入れます(10行目)。 他の状況では、ペアを辞書に格納することなく逆の値を計算できる場合があります。 次に、スタックがあります(11行目)。 この場合のスタックの目的は、開始括弧を格納することです。 文字列を反復処理するときに、文字が辞書のキーであるかどうかをテストすることによって、文字が開始角括弧であるかどうかを確認できます。 それがあれば、私達は私達の積み重ねにそれを押します。 最初の閉じたブラケットを見つけたら、パターンの後半を処理していることがわかっているので、firstHalfブール値をfalseに設定します(12行目)。 この時点の後に開いている括弧が見つかった場合は、ブール値を確認し、失敗したテストを示すことができます。 各閉じ括弧について、最後の開き括弧をポップオフし、それらが正しいキーと値のペアであるかどうかを確認します。 繰り返しますが、文字列を一度だけ反復処理する必要があるため、線形アルゴリズムから多くの値を取得しています。

使用例3:コマンドを元に戻す

最後に、コマンドパターンと組み合わせてスタックを使用して元に戻す履歴を作成します。 開始するには、単純な銀行口座オブジェクトを見てみましょう。 残高と当座貸越限度額、および資金の入金と引き出しのためのいくつかの簡単な方法があります:

depositメソッドとwithdrawメソッドを直接呼び出す代わりに、関連する情報をコマンドに保存できます。 以下のスニペットでは、enumプロパティ(入金または出金)と金額を使用して実行するアクションの種類を指定します。 また、コマンドが実行できたかどうかを示すブール値も格納します(4-11行目)。 引き出し要求が当座貸越限度を超えた場合、銀行口座には何も起こらず、成功したブール値はfalseのままであり、コマンドが完了するとtrueになります(18-26行目)。 コマンドを呼び出すか元に戻すための2つのメソッドがあり、それぞれが銀行口座を引数として取ります(18行目&28)。 これらのメソッドは、銀行口座を取得し、前のスニペットで見たインスタンスメソッドを呼び出します。

銀行口座に戻って、bankaccounttype(47行目)で初期化されたcommandStackプロパティを導入することができます。 入金方法と出金方法をfileprivateとしてマークし、BankAccountCommand(行62&66)でのみアクセスできるようにします。 これで、process(command:)とundoLastCommand()の2つのメソッドが公開されました。 最初のコマンドは入力としてコマンドを受け入れ、銀行口座を入力として実行してから、コマンドをスタックにプッシュします。 一方、undoLastCommandメソッドは、スタックから最後のコマンドをポップし、元に戻す(行51-60)を実行します。

これは非常に単純なパターンであり、非常に強力なパターンです。 可能な適用は無限で、満足なユーザーの経験のために作る。

そして今、アクションのパターンを見てみましょう:

ラップアップ

この記事では、スタックとLIFOの動作の概念を検討しました。 私たちは、二重にリンクされたリストを使用して独自のスタックを実装し、スタックのサイズが変更されたときにメモリをどのように割り当て また、スタックの3つの一般的な使用例を見ていきました:反転、対称性のテスト、および元に戻す。 これらの三つの状況のそれぞれは、現実世界のプロジェクトで無数の時間を思い付く。 私はあなたがそれらのニーズを処理するための適切な構造としてスタックを考えることを願っています。 いつものように、読んでくれてありがとう!

コメントを残す

メールアドレスが公開されることはありません。

More: