A zar ne moze da se upotrebi i (unsigned) int niz od samo tri clana?
Code:
#include <iostream>
using namespace std;
bool valid(const char * t)
{
unsigned int z[3] = {0};
while(*t)
{
switch(*t)
{
case '(':
z[2]++;
break;
case ')':
if(z[2]==0)
{
cout << "Suvisna ')'.\n";
return false;
}
z[2]--;
break;
case '[':
if(z[2])
{
cout << "Nedozvoljeno otvaranje '['\n";
return false;
}
z[1]++;
break;
case ']':
if(!z[1])
{
cout << "Suvisna ']'.\n";
return false;
}
if(z[2])
{
cout << "Nedozvoljeno zatvaranje ']'.\n";
return false;
}
z[1]--;
break;
case '{':
if(z[2] || z[1])
{
cout << "Nedozvoljeno otvaranje '{'.\n";
return false;
}
z[0]++;
break;
case '}':
if(!z[0])
{
cout << "Suvisna '}'.\n";
return false;
}
if(z[1] || z[2])
{
cout << "Nedozvoljeno '}'.\n";
return false;
}
z[0]--;
}
t++;
}
if(z[0]||z[1]||z[2])
{
cout << "Nezatvorene zagrade:" << (z[0]?" {":" ") <<
(z[1]?" [":" ") << (z[2]?" (":"") << '\n';
return false;
}
return true;
}
main()
{
char text[500];
cin.getline(text,500);
valid(text);
}
Nisam siguran da li ima rupa, ali to je jedna ideja...
*edit I*: Switch se moze zameniti i sa nekoliko ugnezdjenih for-ova. Tako ce f-ja biti sporija ali kraca.
*edit II*: opis:
( - ok
) - greska ako nisu otvorene (
[ - greska ako su otvorene (
] - greska ako nisu otvorene [ ili ako su otvorene (
{ - greska ako su otvorene ( ili [
} - greska ako nisu otvorene } ili ako su otvorene ( ili [
greska ako nisu zatvorene sve koje su otvorene.
[Ovu poruku je menjao Mali Misha dana 20.02.2006. u 21:04 GMT+1]
Ipak se ++uje.