Tutorial 4.2 - Parenthesis pair matching

Obiective

Ne dorim:

  • să arătăm funcționalitățile unei stive
  • să verific dacă un șir este corect parantezat

Parenthesis pair matching

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:

  • ab == ()
  • ab == []
  • ab == {}

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;
}

Program de test

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
sd-ca/2016/articole/tutorial-04-2.txt · Last modified: 2017/02/04 22:56 by alexandru.olteanu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0