/*
::Algoritam::
Proveravacemo ispravnost izraza znak po znak.
Usvojimo redosled zagrada tako da je najvece tezine
viticasta {,} druga po redu srednja [,] i treca
obicna zagrada (,).
=========================================================
Gresku u izrazu smo otkrili ako:
--1-- pronadjemo zagradu vece tezine od tezine
zadnje otvorene zagrade. Sta hocu da kazem:
Ako imamo do sada ovaj redosled: { [ ] ( ) (
Zadnja otvorena zagrada je (. Ako je sledeca otorena
zagrada vece tezine, znaci [, {, ] ili } imamo gresku u izrazu.
--2-- pronadjemo zatvorenu zagradu koja predhodno
nije otvorena
--3-- dodjemo do kraja izraza pri cemu neka od zagrada
nije zatvorena
==========================================================
Koristimo tri promenljive tipa int, svaku za po jedan tip
zagrada, na sledeci nacin. Na pocetku ispitivanja inicijalizujemo
ih na 0. Zatim, ako nadjemo na otvorenu zagradu nekog tipa
povecavamo odgovarajucu promenljivu za 1, a kada naidjemo na
zatvorenu zagradu tog tipa smanjujemo njenu vrednost za 1.
Greska -3- se detektuje tako sto nakon pregledanog citavog niza
neka od promanjljivih nije 0, t.j. veca je od nule.
Greska -2- se detektuje tako sto odgovarajuca promenjljiva uzima vrednost
manju od 0 (t.j. -1)
Greska -1- se detektuje tako sto pri povecavanju vrednosti odgovarajucoj
promenjljivoj, promenljive koje kontrolisu zagrade vece tezine nisu 0
(vec su vece od 0).
==========================================================
Valjda si razumeo :)
*/
#include "iostream.h"
using namespace std;
int proveriIzraz(char* izr){
//vraca 0 ako je izraz ispravan, u suprotnom vraca poziciju na kojoj je prva greska
int
zag1 = 0, //{}
zag2 = 0, //[]
zag3 = 0, //()
pozicija = 1;
char* current = izr;
while ( (*current) != 0 ) {
switch ( *current ) {
case '{' :
if ( (zag2 != 0) || (zag3 != 0) ) {
cout << "Greska na poziciji " <<pozicija <<": nedozvoljena zagrada {\n" ;
return pozicija;}
zag1++;
break;
case '}' :
if ( (zag2 != 0) || (zag3 != 0) ) {
cout << "Greska na poziciji " <<pozicija <<" : nedozvoljena zagrada }\n" ;
return pozicija;
}
zag1--;
if ( zag1<0 ) {
cout << "Greska na poziciji " <<pozicija <<" : ne postoji odgovarajuca otvorena zagrada za }.\n";
return pozicija;
};
break;
case '[' :
if ( zag3 != 0) {
cout << "Greska na poziciji " <<pozicija <<": nedozvoljena zagrada [\n" ;
return pozicija;}
zag2++;
break;
case ']' :
if ( zag3 != 0) {
cout << "Greska na poziciji " <<pozicija <<" : nedozvoljena zagrada ]\n" ;
return pozicija;
}
zag2--;
if ( zag2<0 ) {
cout << "Greska na poziciji " <<pozicija <<" : ne postoji odgovarajuca otvorena zagrada za ].\n";
return pozicija;
}
break;
case '(' :
zag3++;
break;
case ')' :
zag3--;
if ( zag3<0 ) {
cout << "Greska na poziciji " <<pozicija <<" : ne postoji odgovarajuca otvorena zagrada za ).\n";
return pozicija;
}
break;
} //switch
pozicija++;
current++;
} //while
if ( (zag1+zag2+zag3) != 0 ) {
cout << "Nisu sve zagrade zatvorene!\n" ;
return pozicija+1;
}
return 0;}
int main(int paramCnt, char** paramStr){
if ( paramCnt == 1 ) {
cout << "Koristi sa: " <<paramStr[0] <<" izraz1 [ izraz2 [ izraz3 [...] ] ] \n" ;
return 1;
}
int i;
for (i=1; i<paramCnt; i++) {
cout << "\nProveravam izraz '" <<paramStr[i] <<"' :\n" ;
if ( proveriIzraz(paramStr[i]) == 0 ) cout << "Izaraz je ispravan. \n";
}
return 0;}