توالی براکت صحیح (RSP)


توالی‌های براکت‌های معمولی شامل براکت‌های باز و بسته‌کننده از یک یا چند نوع هستند که هر براکت بازکننده دارای یک براکت بسته‌کننده است و (در مورد چندین نوع) انواع آن‌ها همپوشانی ندارند. 
SP صحیح: 
( ( ) ) ( ) ( ) 
{ } [ ( ) ] ( ) 
{ [ ( { } ) ] } 
SP نامعتبر: 
) ) ( ( ) ) ( ( 
{ [ ( ] ) } 
( ( ] } 
 
برای بررسی اینکه آیا یک توالی براکت از براکت ها از یک نوع است یا نه، فقط تعادل را بررسی کنید. 
یعنی یک متغیر مساوی صفر (تعادل) را شروع می کنیم. سپس از میان رشته عبور می‌کنیم (اگر نمی‌دانید چگونه این کار را انجام دهید - اجرا، احمق!)، تعادل را هنگامی که به براکت باز می‌شود افزایش می‌دهیم و زمانی که به بسته شدن برخورد می‌کند آن را کاهش می‌دهیم. اگر در هر مرحله تراز منفی شود یا در پایان آن برابر با صفر نباشد، دنباله اشتباه است. 

در صورت وجود چند نوع براکت، همه چیز کمی پیچیده تر می شود. ما یک پشته ایجاد می کنیم تا به عنوان آن متغیر تعادل عمل کند. این امر ضروری است زیرا پرانتزها نمی توانند همپوشانی داشته باشند. وقتی از یک خط عبور می کنیم و با یک پرانتز باز مواجه می شویم، آن را روی پشته فشار می دهیم. هنگامی که با یک مهاربند بسته می‌شویم، سعی می‌کنیم مهاربند بازکننده آن نوع را از پشته جدا کنیم. اگر بریس از نوع دیگری روی پشته باشد، دنباله نامعتبر است. اگر پشته در انتها خالی نباشد، دنباله نیز نامعتبر است. 

تولید توالی براکت های صحیح مستقیماً از روش انجام بررسی پیروی می کند - فقط باید براکت های جدید را بدون نقض صحت اضافه کنیم. این کار با تکرار بازگشتی انجام می شود. اگر او را نمی شناسید - BE... آه، نه، می توانید سعی کنید با خواندن ادامه مطلب متوجه شوید. در اینجا یک نمونه کد برای یک نوع براکت وجود دارد:
 
#include <vector>
#include <iostream>

استفاده از namespace std;
int n; // نصف طول 
بردار<چار> پاسخ // پاسخ ما 

void rec(int تعادل) {
اگر (ans.size() == 2 * n) { // اگر اینطور شد، پس ما انجام شد < /span>
برای (int i = 0; i < 2 * n; i++)
cout << ans[i] << " ";
cout << "\n";
}
اگر (ans.size() + balance + 2 <= n * 2) { // بررسی کنید، ما این کار را انجام می دهیم، مهاربند باز جدید  را می بندیم
// حالا مراقب دستان خود باشید: نیازی نیست برای هر دنباله بردار جداگانه بسازیم 
ans.push_back('(');
rec (تعادل + 1)؛
ans.pop_back(); // برای درک این موضوع، باید از بازگشت آگاه باشید. ابتدا یک پرانتز به وکتور اضافه می کنیم و سپس همه این کدها را دوباره اجرا می کنیم. 
// یعنی اگر بتوانیم دوباره یک پرانتز اضافه کنیم. 
// و این اتفاق می افتد تا زمانی که ما شروع به خروج از بازگشت نکنیم - یعنی تا زمانی که به طول مورد نظر برسیم. 
// سپس براکت ها شروع به برداشتن خواهند کرد. اگر این را می فهمید - من به شما تبریک می گویم، شما عالی هستید. 
}
if (balance > 0) { // اگر بتوانیم یک براکت را ببندیم، آن را می بندیم. 
ans.push_back(')');
rec (تعادل - 1)؛
ans.pop_back();
}
}

 int main()
{
cin>> n
rec(0);

    بازگشت 0;
}
و اکنون زمان دشواری ها - شما باید خودتان الگوریتم را برای چندین نوع براکت بنویسید! موهاهاهاهاهاهاهاهاهاها!