スタックとキュー
1.スタック
スタックの抽象データ構造スタックは、テーブルの一方の端での挿入と削除に制限された線形テーブルです。挿入と削除が可能な端をスタックの最上位と呼び、もう一方の端の固定端をスタックの最下部と呼びます。テーブルに要素がない場合、それは空のスタックと呼ばれます。
スタックはLIFO(後入れ先出し)で注文されます。
スタック操作は次のとおりです。
- Stack()は、新しい空のスタックを作成します。
- push(item)は、スタックの一番上に新しいアイテムを追加します。
- pop()は、スタックの最上位アイテムを削除し、スタックの最上位アイテムの値を返します。スタックが変更されます。
- peek()は、スタックの最上位のアイテムを返します。スタックを変更しないでください。
- isEmpty()スタックが空であるかどうかをテストし、ブール値を返します。
- size()は、スタックの長さ(スタック内のアイテムの数)を返します。
スタックは、配列またはリンクリストを介して簡単に実装できます
1.1リスト実装スタック
class Stack:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def push(self, item):
self.items.append(item)
def pop(self):
return self.items.pop()
def peek(self):
return self.items[-1]
def size(self):
return len(self.items)
if __name__ == '__main__':
s = Stack()
print(s.isEmpty())
s.push(4)
s.push('Rocket')
print(s.peek())
s.push(True)
print(s.size())
print(s.isEmpty())
s.push(88
print(s.pop())
print(s.pop())
print(s.size())
1.2単純なブラケットマッチング
Python3の実装:
# coding=utf-8
class Stack:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def push(self, item):
self.items.append(item)
def pop(self):
return self.items.pop()
def peek(self):
return self.items[-1]
def size(self):
return len(self.items)
def parChecker(symbol_string):
s = Stack()
balanced = True
index = 0
while index < len(symbol_string) and balanced:
symbol = symbol_string[index]
if symbol == '(':
s.push(symbol)
else:
if s.isEmpty():
balanced = False
else:
s.pop()
index += 1
if balanced and s.isEmpty():
return True
else:
return False
print(parChecker('((()))'))
print(parChecker('((()'))
from stack import Stack
def check(strings):
s = Stack()
for string in strings:
if string == '(':
s.push(string)
elif string == ')':
try:
s.pop()
except IndexError:
return False
else:
return False
return s.isEmpty()
print(check('((()))'))
print(check('()))'))
2.キュー
キューは、ノードの挿入操作を一方の端で修正し、ノードの削除操作をもう一方の端で修正するように制限する線形テーブルです。
- 基本的な考え方
- 先入れ先出しFIFO
- オペレーティング:
- エンキュー:キューの最後にアイテムを追加します
- デキュー:キューの先頭からアイテムを削除します
- サイズ:キュー内の現在のアイテム数を返します
- ピーク:キューを削除するのではなく、キューの現在の最上位要素を返します
- キューは(循環)配列またはリンクリストによって実現できます
2.1スタック実装キュー:
# coding=utf-8
# 使用栈实现队列
class QueueWithTwoStack:
def __init__(self):
self.insertStack = []
self.popStack = []
def enqueue(self,e):
self.insertStack.append(e)
return e
def dequeue(self):
if len(self.insertStack)==0 and len(self.popStack)==0:
return None
if len(self.popStack) == 0:
while len(self.insertStack)!=0:
self.popStack.append(self.insertStack.pop())
return self.popStack.pop()
mystack = QueueWithTwoStack()
e = mystack.enqueue(8)
print(e)
e = mystack.enqueue(9)
print(e)
e = mystack.enqueue(10)
print(e)
print(mystack.dequeue())
print(mystack.dequeue())
print(mystack.dequeue())