Stack
スタックは、コンピュータで用いられる基本的なデータ構造の1つで、データを後入れ先出し(LIFO: Last In First Out; FILO: First In Last Out)の構造で保持するものである。抽象データ型としてのそれを指すこともあれば、その具象を指すこともある。
出典: フリー百科事典『ウィキペディア(Wikipedia)』
- Stackは「積み重ね」という意味です。
- データをどんどんと積み重ねていくイメージです。積み重ねることをPushと言います。
- データを取る時は積み重なっているので、一番上のデータしか取ることできません。これをPopと言います。
- 一番最後に入ったもの(Last In)が、一番最初に取り出される(First Out)でLIFOと呼ばれます。
Stackの実装
Pythonのリストを使い実装します。
Pythonのドキュメントに書いてあることをクラスにするだけです。
class Stack(): def __init__(self): self.stack = [] # データを追加する。 def push(self, item): self.stack.append(item) # データを取り出す。 def pop(self): return self.stack.pop() # スタックの中身を確認する。 def get_stack(self): return self.stack
Stackを使い括弧の対応関係を調べる
括弧を含む一つの文が与えられたときに、その括弧に対応する括弧があるかどうかを確認します。
from stack import Stack # 括弧がちゃんと対応しているか確認する def is_match(parenth1, parenth2): if parenth1 == "(" and parenth2 == ")": return True elif parenth1 == "{" and parenth2 == "}": return True elif parenth1 == "[" and parenth2 == "]": return True else: return False def check(string): stack = Stack() is_balanced = True opening = "([{" closing = ")]}" for char in string: # 始まりの括弧であればスタックに積む。 if char in opening: stack.push(char) # 閉じ括弧の場合 elif char in closing: # スタックが空の場合は、対応する始まりの括弧がないのでエラー。 if stack.is_empty(): is_balanced = False break # スタックに積んである場合は、対応関係を確認する。 else: top = stack.pop() if not is_match(top, char): is_balanced = False break # 括弧以外の時は何もしない。 else: pass if stack.is_empty() and is_balanced: return True else: return False # True print(check("((def)gx)")) # False print(check("(((h)")) # True print(check("func(a[1], **{'apple':1, 'orange':2, 'banana':3})" )) # False print(check("func(a[1], **{'apple':1, 'orange':2, 'banana':3])"))
Stackを使い10進数を2進数に変換する
10進数から2進数への変換の仕組みが分かりやすく説明されています。
つまり、10進数の数をどんどん2で割って余りを下のほうから足し上げれば、2進数に変換できます。
from stack import Stack def decimal_to_binary(decimal_num): stack = Stack() while decimal_num > 0: remainder = decimal_num % 2 stack.push(remainder) decimal_num = decimal_num // 2 binary_num = "" while not stack.is_empty(): binary_num += str(stack.pop()) return binary_num # # 1001100 # print(decimal_to_binary(76)) # # 10010010 # print(decimal_to_binary(146))