Python言語においては、リストというデータ構造が豊富な機能を持っています。特に、リストをスタック(後入れ先出し)やキュー(先入れ先出し)として用いるケースは多くあります。この記事では、Pythonのリストを使ってスタックとキューの操作をどのように行うかについて解説します。具体的なコード例とその解説、応用例を含めています。
目次
基本的なスタック操作
スタックは後入れ先出し(LIFO: Last-In, First-Out)の原則に基づいたデータ構造です。Pythonではリストを使って簡単にスタックを実装することができます。
要素の追加(Push)
スタックに要素を追加する操作をPushと呼びます。
stack = []
stack.append(1)
stack.append(2)
stack.append(3)
# スタックに 1, 2, 3 が追加されます
要素の取り出し(Pop)
要素を取り出す操作をPopと呼びます。
item = stack.pop()
# item には最後に追加された '3' が格納されます
基本的なキュー操作
キューは先入れ先出し(FIFO: First-In, First-Out)の原則に基づいたデータ構造です。
要素の追加(Enqueue)
キューに要素を追加する操作をEnqueueと呼びます。
queue = []
queue.append(1)
queue.append(2)
queue.append(3)
# キューに 1, 2, 3 が追加されます
要素の取り出し(Dequeue)
要素を取り出す操作をDequeueと呼びます。
item = queue.pop(0)
# item には最初に追加された '1' が格納されます
応用例
リストを用いたジョブスケジューラー
キューは非常に実用的なデータ構造であり、例えばジョブスケジューラーのようなものを作成する際に有用です。
from time import sleep
job_queue = []
def add_job(job):
job_queue.append(job)
def execute_jobs():
while job_queue:
job = job_queue.pop(0)
job()
sleep(1) # 1秒待つ
add_job(lambda: print("Job 1"))
add_job(lambda: print("Job 2"))
execute_jobs()
スタックを用いた逆ポーランド記法計算器
逆ポーランド記法(RPN)は、数学的な式を表現する一つの方法で、スタックが役立つ例としてよく挙げられます。
def rpn_calculator(expression):
stack = []
for token in expression.split():
if token.isdigit():
stack.append(int(token))
else:
operand2 = stack.pop()
operand1 = stack.pop()
if token == '+':
stack.append(operand1 + operand2)
elif token == '-':
stack.append(operand1 - operand2)
elif token == '*':
stack.append(operand1 * operand2)
elif token == '/':
stack.append(operand1 / operand2)
return stack.pop()
print(rpn_calculator("5 3 + 7 *")) # (5 + 3) * 7 = 56
複数のスタックを用いた履歴機能
スタックは「戻る」機能や「やり直し」機能を持つアプリケーションで頻繁に使用されます。
undo_stack = []
redo_stack = []
def add_action(action):
undo_stack.append(action)
redo_stack
.clear()
def undo():
if undo_stack:
action = undo_stack.pop()
redo_stack.append(action)
def redo():
if redo_stack:
action = redo_stack.pop()
undo_stack.append(action)
# 使用例
add_action("テキストを挿入")
undo()
redo()
まとめ
Pythonのリストは非常に多機能であり、スタックやキューとしても使いやすいデータ構造です。これらの基本的な操作を理解し、応用例を参考にして、Pythonでのプログラミングがより効率的に行えるでしょう。
コメント