Ne dorim:
Verificati daca un sir format doar din paranteze rotunde este valid (parantezare corecta).
Pentru a rezolva această problemă, propunem implementarea unei funcții valid, care primește un string format doar din paranteze rotunde și returnează true dacă șirul este corect parantezat.
bool valid(const std::string &s) { // stiva folosita in care vom insera parantezele std::stack<char> st; // parcurgem sirul for (int i = 0; i < s.size(); ++i) { // daca am gasit o paranteza deschisa o introducem in stiva if (s[i] == '(') { st.push(s[i]); } else { // altfel s[i] == ')', deci ar trebui sa fie perechea lui st.top() if (!st.empty() && st.top() == '(') { st.pop(); // pereche valida, elimin paranteza deschisa din stiva } else { // fie in varful stivei nu am o paranteza deschisa // fie stiva este goala return false; } } } // daca stiva este goala, atunci sirul este corect parantezat return st.empty(); }
Putem extinde problema dacă considerăm că sirul poate conține toate tipurile de paranteze (
, [
, {
, )
, ]
, }
. Adaptăm soluția anterioară astfel:
bool valid(const std::string &s) { // stiva folosita in care vom insera parantezele std::stack<char> st; // parcurgem sirul for (int i = 0; i < s.size(); ++i) { // daca am gasit o paranteza deschisa o introducem in stiva if (s[i] == '(' || s[i] == '[' || s[i] == '{') { st.push(s[i]); } else { // altfel s[i] este o paranteza inchisa , deci ar trebui // sa fie perechea lui st.top() if (!st.empty() && validPair(st.top(), s[i])) { st.pop(); // pereche valida, elimin paranteza deschisa din stiva } else { // fie in varful stivei nu am o paranteza deschisa // fie stiva este goala return false; } } } // daca stiva este goala, atunci sirul este corect parantezat return st.empty(); }
Unde pair este o funcție care verifica dacă caracterele a și b reprezintă o pereche validă de paranteze. Posibilități:
unde prin ab se înțelege concatenarea de caractere.
bool validPair(const char &a, const char &b) { if (a == '(' && b == ')') { return true; } if (a == '[' && b == ']') { return true; } if (a == '{' && b == '}') { return true; } return false; }
Pentru rulare și testare puteți folosi următoarea funcție main.
int main() { // sirul pentru care se doreste verificarea std::string s; //citire sire std::cout << "s = "; std::cin >> s; // verificare std::cout << (valid(s) ? "Corect" : "Incorect") << "\n"; return 0; }
Compilare
g++ main.cpp -o main
Exemple:
./main s = (()) Corect
./main s = ([{}]) Corect
./main s = ((()) Incorect