Clasa a XII-a · Structuri de date și STLRead in English
stack — verificarea parantezelor în C++
În engleză: stack: checking brackets
Ideea
Un șir cu paranteze (), [] și {} este corect dacă fiecare paranteză închisă se potrivește cu ultima paranteză deschisă rămasă neînchisă. „Ultima deschisă, prima închisă” este exact regula stivei: punem în stack<char> parantezele deschise, iar la una închisă verificăm că vârful este perechea ei și o scoatem. Șirul e corect dacă nu apare nicio nepotrivire și stiva rămâne goală la final.
Descrierea în engleză
A string with the brackets (), [] and {} is correct if every closing bracket matches the last opening bracket still left open. 'Last opened, first closed' is exactly the stack rule: we push the opening brackets onto a stack<char>, and on a closing one we check that the top is its pair and pop it. The string is correct if no mismatch appears and the stack is empty at the end.
- Complexitate
- O(n)
- Clasa
- Clasa a XII-a (Grade 12)
- Capitol
- Structuri de date și STL
Exemple
Intrare
{[()()]}Ieșire așteptată
corect
Intrare
([)]
Ieșire așteptată
incorect
Intrare
(()
Ieșire așteptată
incorect
Codul C++
Codul complet, cu comentarii în română. Îl poți modifica liber și îl poți reseta oricând.
/*
* Titlu: stack — verificarea parantezelor
* Clasa: 12
* Capitol: Structuri de date și STL
* Descriere: Un șir cu paranteze (), [] și {} este corect dacă fiecare paranteză
* închisă se potrivește cu ultima paranteză deschisă rămasă neînchisă.
* „Ultima deschisă, prima închisă” este exact regula stivei: punem în
* stack<char> parantezele deschise, iar la una închisă verificăm că
* vârful este perechea ei și o scoatem. Șirul e corect dacă nu apare
* nicio nepotrivire și stiva rămâne goală la final.
* Complexitate: O(n)
*
* Exemplu
* Intrare: {[()()]}
* Ieșire: corect
*
* Exemplu
* Intrare: ([)]
* Ieșire: incorect
*
* Exemplu
* Intrare: (()
* Ieșire: incorect
*/
#include <iostream>
#include <stack>
#include <string>
using namespace std;
char deschisa(char c)
{
if (c == ')')
return '(';
if (c == ']')
return '[';
return '{';
}
bool corect(const string &s)
{
stack<char> st;
for (char c : s)
{
if (c == '(' || c == '[' || c == '{')
st.push(c);
else
{
if (st.empty() || st.top() != deschisa(c))
return false;
st.pop();
}
}
return st.empty();
}
int main()
{
string s;
cin >> s;
cout << (corect(s) ? "corect" : "incorect") << '\n';
return 0;
}
Rulează pe un g++ adevărat (C++17, -O2) prin Compiler Explorer. Programele trebuie să se termine repede: există o limită de timp.