スタック(積み重ね)が広く使われているのコンピューターフィールドコレクションであり、スタックは、アクセスがトップ(上)と呼ばれる期間に厳しく制限されている、線形コレクションです。たとえば、追加したときに、プレートを埋めるとき、あなたはほとんどのプレートのスタックの一番上にある、新しいプレートを取るたびにきれいな食器の山を積み重ねたいと思った時に、上にもあります皿の底には、あなたは決して使用しないかもしれません。スタックの最も一般的な操作は、次の二つがあります
プッシュ(a)の#はスタックの圧入に押し込まれ
、ポップ()#ポップスタックポップの最後の要素を
スタックは括弧文字列の残高を確認するかどうか
アルゴリズム思考:
(文字列として表される)1順次走査演算式、左括弧スタックへのブラケットのための時間の三種類に直面したとき、
右括弧の特定のタイプにスキャンする場合の電流とを比較する、2。先頭の要素が一致するかどうか、試合はデ積み重ね続けると判断された場合;
; 3.スタックの現在のトップは、間違ったペアリングのオーダーのブラケットを現在のスキャンブラケットと一致しない場合、マッチが失敗し、終了し
た文字列であれば4 ;右括弧は、現在、いくつかのタイプのスタックであることは、右括弧出口、マッチが失敗し、括弧を左より、空である
(すなわち、左スタックの特定の種類が存在する5列走査サイクルが終了し、スタックが空でない場合ブラケット)、右括弧より、左括弧、マッチが失敗;
6正しくブラケットの正常終了と一致します。
class Stack(object):
def __init__(self, limit=10):
self.stack = [] #存放元素
self.limit = limit #栈容量极限
def push(self, data): #判断栈是否溢出
if len(self.stack) >= self.limit:
print('StackOverflowError')
pass
self.stack.append(data) #没有溢出将data放入self.stack
def pop(self):
if self.stack:
return self.stack.pop()
else:
raise IndexError('pop from an empty stack') #空栈不能被弹出
def peek(self): #查看堆栈的最上面的元素
if self.stack:
return self.stack[-1]
def is_empty(self): #判断栈是否为空
return not bool(self.stack)
def size(self): #返回栈的大小
return len(self.stack)
def balanced_parentheses(parentheses):
stack = Stack(len(parentheses))
for parenthesis in parentheses: #字符串的每个元素
if parenthesis == '(': #如果是左括号,压栈
stack.push(parenthesis)
elif parenthesis == ')': 如果是右括号,判断栈是不是空,为空则不匹配,返回False
if stack.is_empty():
return False
stack.pop() #不为空,则左右匹配,将之前压栈的左括号弹出,进行下一个字符的匹配
return stack.is_empty() 返回布尔类型
if __name__ == '__main__':
examples = ['((()))', '((())', '(()))']
print('Balanced parentheses demonstration:\n')
for example in examples:
print(example + ': ' + str(balanced_parentheses(example)))
結果:
バランス括弧デモンストレーション:
((())):真
((()):偽
(())):偽
簡単に言えば、左側のブラケットがスタック、右括弧が満たされ、その後、満たされている:
1)スタック内の要素があるかどうかを判断するために、それはアンバランス、まず右から左後に表示されていない、Falseを返します
2)して、トップの要素かどうかを判断します現在の右括弧が一致し、一致しない場合、一致した場合には、Falseを返し、トップ要素を削除して、次のサイクルに進み
、スタック内の要素が存在するかどうかを決定するために、サイクルの終了後、最後に、アンバランス、左括弧、右括弧の数よりも多くがあることを示し、一致していません。バランスについての説明とは、Trueを返しません。
文字列を逆にするには:
def str_reverse(str):
s = Stack()
result = ''
for i in str:
s.push(i)
while not s.is_empty():
result += s.pop()
return result