たそらぼ

日頃思ったこととかメモとか。

Stack自作する

Stackを自作した。
もちろんいままで組み込みの構造を使ったことはあるし、理屈も知っている。
しかしちゃんと自分で書いたことがないのはダメなので書いてみた。

自作したStack

クラスとしてはこんな感じ。
f:id:tasotasoso:20190521231159p:plain
pop()とpush()でstack[]に要素を格納/取り出ししていく感じ。
is_full()とis_null()で異常系の処理ができる仕様にする。

# --- coding: utf-8 ---
import sys

class Stack():
    def __init__(self):
        self.stack = []
        self.top = -1
        self.MAX = 100

    def push(self, x):
        """
        このメソッドが呼ばれた時点でMAX以上積まれていたら、
        self.is_full()でexitする。
        """
        if self.is_full():
            print("This stack is full!!")
            sys.exit()
    
        self.stack.append(x)
        self.top += 1

    def pop(self):
        """
        このメソッドが呼ばれた時点でtopが-1なら、
        self.is_null()でexitする。
        """
        if self.is_null():
            print("This stack is null!!")
            sys.exit()

        tmp = self.stack[self.top]
        del(self.stack[self.top])

        self.top -= 1
        return tmp

    def is_null(self):
        if self.top < 0:
            return True
        else:
            return False

    def is_full(self):
        if self.top +1 >= self.MAX:
            return True
        else:
            return False

動作確認

①正常系

if __name__ == '__main__':
    stack = Stack()

    stack.push("1")
    stack.push("1")
    print(stack.pop())

ちゃんと1が表示される。

②is_full()を呼んでexitさせる異常系

    if __name__ == '__main__':
    stack = Stack()

    for i in range(101):
        stack.push("1")

This stack is full!!が表示される。

③is_null()を呼んでexitさせる異常系

if __name__ == '__main__':
    stack = Stack()

    stack.push("1")
    print(stack.pop())
    print(stack.pop())

This stack is null!!が表示される。

感想

マイstackが書けた。うれしい。
ほかのデータ構造にもガシガシチャレンジしていきたい。