Pythonでリストを使ってスタックとキューを操作する方法

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でのプログラミングがより効率的に行えるでしょう。

コメント

コメントする

目次