online: 8; azi: 1086; total: 51541 Manual clasa a xi a - Implementarea structurilor de date - Lista liniara

Probleme Rezolvate



Manual clasa a Xi a

Implementarea structurilor de date

Lista liniara

Să se verifice dacă o expresie aritmetică ce conține paranteze este balansată, adică dacă fiecare paranteză deschisă este închisă corect. De exemplu, expresia ( a+b +{c/[d-e]})+(d/s) este balansată, iar expresia ( a+b +{c/[d-e}])+(d/s) nu este balansată. (Indicație. Se codifică parantezele 1-(; 2-[; 3-{; 4-); 5-]; 6-}). Dacă stiva nu este vidă şi dacă diferenţa dintre codul dintre paranteza citită şi codul parantezei din vârful stivei este 3, atunci se elimină nodul din vârful stivei; altfel, se adaugă la stivă codul parantezei citite. Dacă stiva este vidă la terminarea evaluării expresiei, înseamnă că expresia este balansată.)
# include < iostream >
# include < fstream >
# include < cstring >
using namespace std ;
const int MAX_SIZE = 100 ;
struct Stack {
int data[MAX_SIZE];
int top;
};
void init ( Stack & s) {
s.top = -1 ;
}
bool isEmpty ( Stack & s) {
return s.top == -1 ;
}
bool isFull ( Stack & s) {
return s.top == MAX_SIZE - 1 ;
}
void push ( Stack & s, int value ) {
if (! isFull (s)) {
s.top ++;
s.data [ s.top ] = value ;
}
}
int pop ( Stack & s) {
if (! isEmpty (s)) {
int value = s.data [ s.top ];
s.top --;
return value ;
}
return -1 ;
}
int top ( Stack & s) {
if (! isEmpty (s)) {
return s.data [ s.top ];
}
return -1 ;
}
bool is_balanced ( string expr ) {
Stack s;
init (s);
for ( int i = 0 ; i < expr.length (); i++) {
if ( expr [i] == '(' || expr [i] == '[' || expr [i] == '{' ) {
push (s, expr [i]);
} else if ( expr [i] == ')' || expr [i] == ']' || expr [i] == '}' ) {
if ( isEmpty (s) ||
( expr [i] == ')' && top(s) != '(' ) ||
( expr [i] == ']' && top(s) != '[' ) ||
( expr [i] == '}' && top(s) != '{' )) {
return false ;
}
pop(s);
}
}
return isEmpty (s);
}
int main () {
string expr ;
// Citim expresia dintr-un fisier text
ifstream in ( "input.txt" ) ;
getline (in, expr );
in.close ();
// Verificam daca expresia este balansata
if ( is_balanced ( expr )) {
cout << "Expresia este balansata." << endl ;
} else {
cout << "Expresia nu este balansata." << endl ;
}
return 0 ;
}
# include < iostream >
# include < fstream >
# include < stack >
using namespace std ;
bool is_balanced ( string expr ) {
stack < char > s;
for ( int i = 0 ; i < expr.length (); i++) {
if ( expr [i] == '(' || expr [i] == '[' || expr [i] == '{' ) {
s.push ( expr [i]);
} else if ( expr [i] == ')' || expr [i] == ']' || expr [i] == '}' ) {
if ( s.empty () ||
( expr [i] == ')' && s.top () != '(' ) ||
( expr [i] == ']' && s.top () != '[' ) ||
( expr [i] == '}' && s.top () != '{' )) {
return false ;
}
s.pop ();
}
}
return s.empty ();
}
int main () {
string expr ;
// Citim expresia dintr-un fisier text
ifstream in ( "input.txt" ) ;
getline (in, expr );
in.close ();
// Verificam daca expresia este balansata
if ( is_balanced ( expr )) {
cout << "Expresia este balansata." << endl ;
} else {
cout << "Expresia nu este balansata." << endl ;
}
return 0 ;
}