Clasa a XI-a · Alocare dinamică: liste, stive, coziRead in English
Verificarea parantezelor cu o stivă în C++
În engleză: Checking brackets with a stack
Ideea
Un șir format din paranteze ( ) [ ] { } este corect dacă fiecare paranteză deschisă se închide cu una de același tip, în ordinea potrivită. Parcurgem șirul: o paranteză deschisă se pune pe stivă; la una închisă, vârful stivei trebuie să fie perechea ei deschisă, pe care o scoatem. La final stiva trebuie să fie goală. Se afișează DA sau NU.
Descrierea în engleză
A string made of the brackets ( ) [ ] { } is correct if every opening bracket is closed by one of the same type, in the right order. We walk the string: an opening bracket is pushed onto the stack; for a closing one, the top of the stack must be its matching opening bracket, which we pop. At the end the stack must be empty. YES or NO (DA/NU) is printed.
- Complexitate
- O(n) timp și memorie, unde n este lungimea șirului
- Clasa
- Clasa a XI-a (Grade 11)
Exemple
Intrare
{[()()]}Ieșire așteptată
DA
Intrare
([)]
Ieșire așteptată
NU
Intrare
(()
Ieșire așteptată
NU
Codul C++
Codul complet, cu comentarii în română. Îl poți modifica liber și îl poți reseta oricând.
/*
* Titlu: Verificarea parantezelor cu o stivă
* Clasa: 11
* Capitol: Alocare dinamică: liste, stive, cozi
* Descriere: Un șir format din paranteze ( ) [ ] { } este corect dacă fiecare paranteză
* deschisă se închide cu una de același tip, în ordinea potrivită. Parcurgem
* șirul: o paranteză deschisă se pune pe stivă; la una închisă, vârful stivei
* trebuie să fie perechea ei deschisă, pe care o scoatem. La final stiva trebuie
* să fie goală. Se afișează DA sau NU.
* Complexitate: O(n) timp și memorie, unde n este lungimea șirului
*
* Exemplu
* Intrare: {[()()]}
* Ieșire: DA
*
* Exemplu
* Intrare: ([)]
* Ieșire: NU
*
* Exemplu
* Intrare: (()
* Ieșire: NU
*/
#include <iostream>
#include <cstring>
using namespace std;
char s[10005], st[10005];
int vf = 0;
char pereche(char c)
{
if (c == ')')
{
return '(';
}
if (c == ']')
{
return '[';
}
return '{';
}
int main()
{
cin >> s;
int n = strlen(s);
bool corect = true;
for (int i = 0; i < n && corect; i++)
{
if (s[i] == '(' || s[i] == '[' || s[i] == '{')
{
st[++vf] = s[i];
}
else if (vf > 0 && st[vf] == pereche(s[i]))
{
vf--;
}
else
{
corect = false;
}
}
if (vf > 0)
{
corect = false;
}
cout << (corect ? "DA" : "NU") << '\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.