تطابق پرانتزها
با یک پشته بررسی میکند که پرانتزها، کروشهها و آکولادها درست باز و بسته شدهاند: هر بسته باید با آخرین باز همنوع باشد.
شمردن بازها و بستهها کافی نیست (([)] تعداد برابر دارد ولی درست نیست). هر بسته باید با آخرین پرانتزی که باز شده و هنوز بسته نشده جور باشد؛ «آخرین باز، اولین بسته» همان رفتار پشته است.
- زمان:
O(n) - حافظه:
O(n) - هوروویتز–ساهنی، فصل ۳
{a*[b+(c-d)]}؛ سه نوع پرانتز تودرتو، همه جور.
def balanced(s):pairs = {")": "(", "]": "[", "}": "{"}stack = []for i in range(len(s)):ch = s[i]if ch in "([{":stack.append(ch)elif ch in pairs:if not stack:return Falsetop = stack.pop()if top != pairs[ch]:return Falsepair = top + chif stack:return Falsereturn True
شروع اجرا
0123456789101112
{a*[b+(c-d)]}
stack—
متغیرهای محلی
s'{a*[b+(c-d)]}'
نارنجی = در همین گام عوض شد
Call stack
- balanced()خط 1
گام ۱ از ۷۰
توضیح
ایده
شمردن بازها و بستهها کافی نیست (([)] تعداد برابر دارد ولی درست نیست). هر بسته باید با آخرین پرانتزی که باز شده و هنوز بسته نشده جور باشد؛ «آخرین باز، اولین بسته» همان رفتار پشته است.
الگوریتم
- پرانتز باز را روی پشته بگذار.
- پرانتز بسته: پشته نباید خالی باشد و بالای آن باید همان نوع باز باشد؛ آن را بردار.
- در پایان پشته باید خالی باشد.
کاربرد
کامپایلرها، ویرایشگرهای متن (پیدا کردن جفت پرانتز) و بررسی درستی HTML/XML.
در trace به چه چیزی نگاه کنی
- اشارهگر
iروی رشته و کارتstackکه پرانتزهای باز را نشان میدهد.