Python
 Computer >> コンピューター >  >> プログラミング >> Python

【Python】スタックを実装するプログラムの書き方とサンプルコード解説


Pythonでスタックを実装する場合は、まずスタック専用のクラスを定義し、そのインスタンスを生成します。その後、要素を追加する「プッシュ(push)」や、要素を取り出す「ポップ(pop)」を行うメソッドを定義し、インスタンスを通じてこれらのメソッドを呼び出して利用します。

スタックとは

スタックは「後入れ先出し(LIFO: Last-In, First-Out)」と呼ばれるデータ構造です。最後に追加した要素が最初に取り出されるという特性を持ち、テキストエディタの元に戻す(Undo)機能や、プログラムの関数呼び出し履歴の管理など、さまざまな場面で活用されています。

サンプルコード

以下は、Pythonでスタックを実装し、対話的に操作できるようにしたプログラムの例です。

class Stack_struct:
    def __init__(self):
        self.items = []

    def check_empty(self):
        return self.items == []

    def add_elements(self, my_data):
        self.items.append(my_data)

    def delete_elements(self):
        return self.items.pop()

my_instance = Stack_struct()
while True:
    print('Push <value>')
    print('Pop')
    print('Quit')
    my_input = input('What operation would you like to perform ? ').split()

    my_op = my_input[0].strip().lower()
    if my_op == 'push':
        my_instance.add_elements(int(my_input[1]))
    elif my_op == 'pop':
        if my_instance.check_empty():
            print('The stack is empty')
        else:
            print('The deleted value is : ', my_instance.delete_elements())
    elif my_op == 'quit':
        break

実行結果

Push <value>
Pop
Quit
What operation would you like to perform ? Push 6
Push <value>
Pop
Quit
What operation would you like to perform ? Push 8
Push <value>
Pop
Quit
What operation would you like to perform ? Push 34
Push <value>
Pop
Quit
What operation would you like to perform ? Pop
The deleted value is : 34
Push <value>
Pop
Quit

この実行結果から、「最後に追加した値34が最初に取り出されている」ことがわかります。これこそがスタックのLIFO(後入れ先出し)の動作です。

コードの解説

  • 必要な属性を持つ「Stack_struct」クラスを定義します。

  • __init__メソッド(イニシャライザ)では、スタックの本体となる空のリストを作成しています。

  • check_emptyメソッドは、リスト(スタック)が空かどうかを判定するためのものです。

  • add_elementsメソッドは、append()を使ってスタックの末尾に新しい要素を追加します。

  • delete_elementsメソッドは、pop()を使ってスタックから最後に入った要素を取り出します。

  • Stack_structクラスのインスタンスを生成し、以降の操作で使用します。

  • whileループの中で、ユーザーに実行したい操作の入力を求めます。

  • 入力されたコマンド(push / pop / quit)に応じて、対応する処理が実行されます。

  • 処理結果はコンソールに表示され、「quit」が入力されるとプログラムを終了します。

ポイント

入力値はsplit()で分割され、1つ目の要素が操作の種類、2つ目の要素が追加する値として扱われます。また、比較前にlower()で小文字化しているため、コマンドの判定は小文字の「quit」と一致させる必要がある点に注意しましょう。pop()の前にcheck_empty()で空チェックを行うことで、空のスタックから要素を取り出そうとしてエラーになるのを防いでいます。

  1. Pythonで二分探索木(BST)の指定範囲内にあるノード数を求める方法

    問題の概要 二分探索木(BST)が与えられ、さらに左側の境界値 l と右側の境界値 r が指定されます。このとき、木に含まれるすべてのノードの中で、値が l 以上 r 以下の範囲内にあるノードの個数を求めるのが目的です。 例えば、次のような木が与えられたとします。 このとき l = 7、r = 13 とすると、範囲内に含まれるノードは 8、10、12 の3つなので、出力は 3 になります。 アルゴリズムの考え方 スタックを使った反復的な深さ優先探索(DFS)で木をたどります。重要なポイントは、二分探索木の性質を活かして枝刈り(pruning)を行うことです。値が境界より小さいノードの左側の

  2. 【Python】strstr関数を実装する方法:部分文字列の最初の出現位置を検索する

    問題概要2つの文字列 str(対象文字列)と sub_str(検索する部分文字列)が与えられたとします。このとき、str の中で sub_str が最初に出現する位置(インデックス)を見つける必要があります。例えば、str が「helloworld」で、sub_str が「lo」である場合、出力は 3 となります。C言語では標準ライブラリの strstr() 関数を使うことで同様の処理を行えますが、ここでは strstr() と同じ動作をする関数をPythonで独自に実装していきます。アルゴリズムの手順この問題は、以下の手順で解くことができます。i := 0、j := 0 で初期化し、m を