データ構造スタックとキュー

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())

おすすめ

転載: blog.csdn.net/weixin_44127327/article/details/108248809