【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()で空チェックを行うことで、空のスタックから要素を取り出そうとしてエラーになるのを防いでいます。
-
Pythonで二分探索木(BST)の指定範囲内にあるノード数を求める方法
問題の概要 二分探索木(BST)が与えられ、さらに左側の境界値 l と右側の境界値 r が指定されます。このとき、木に含まれるすべてのノードの中で、値が l 以上 r 以下の範囲内にあるノードの個数を求めるのが目的です。 例えば、次のような木が与えられたとします。 このとき l = 7、r = 13 とすると、範囲内に含まれるノードは 8、10、12 の3つなので、出力は 3 になります。 アルゴリズムの考え方 スタックを使った反復的な深さ優先探索(DFS)で木をたどります。重要なポイントは、二分探索木の性質を活かして枝刈り(pruning)を行うことです。値が境界より小さいノードの左側の
-
【Python】strstr関数を実装する方法:部分文字列の最初の出現位置を検索する
問題概要2つの文字列 str(対象文字列)と sub_str(検索する部分文字列)が与えられたとします。このとき、str の中で sub_str が最初に出現する位置(インデックス)を見つける必要があります。例えば、str が「helloworld」で、sub_str が「lo」である場合、出力は 3 となります。C言語では標準ライブラリの strstr() 関数を使うことで同様の処理を行えますが、ここでは strstr() と同じ動作をする関数をPythonで独自に実装していきます。アルゴリズムの手順この問題は、以下の手順で解くことができます。i := 0、j := 0 で初期化し、m を