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

O(n)C++1771 de linii3 exemple

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

Exemplul 1

Intrare

{[()()]}

Ieșire așteptată

DA
Exemplul 2

Intrare

([)]

Ieșire așteptată

NU
Exemplul 3

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.

verificarea-parantezelor.cpp
/*
 * 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.