Błąd logiczny?

0

Witam!
Mam problem natury bardzo banalnej, ale mimo to nie potrafię zrozumieć, co jest źle w moim toku myślenia.
Na początku klasy zdefiniowałem:

boolean beka = true;
int licznikOkr=0;
int licznikKwa=0;
int licznikDzi=0;

Następnie tą zmienną("boolean beka") wykorzystuję w pętli, która zlicza nawiasy, ale nie rozumiem czemu jej wartość jest zawsze przeciwna tej, której się spodziewam(co w sumie nie jest problemem jak znam tą zależność, ale wypadałoby zrozumieć czemu tak jest). Podaję swój kod, żebym lepiej mógł wytłumaczyć o co mi chodzi:

        while(!stos.isEmpty()){
            String a =stos.pop();
            switch (a) {
                case "(":
                    licznikOkr++;
                    break;
                case "[":
                    licznikKwa++;
                    break;
                case "{":
                    licznikDzi++;
                    break;
                case ")":
                    //przypadek gdy nie ma nawiasu otwierajacego, a pojawia sie zamykajacy
                    if (licznikOkr == 0) beka = false;
                    licznikOkr--;
                    break;
                case "]":
                    if (licznikKwa == 0) beka = false;
                    licznikKwa--;
                    break;
                case "}":
                    if (licznikDzi == 0) beka = false;
                    licznikDzi--;
                    break;
            }
        }
        if(licznikDzi==0 && licznikKwa==0 && licznikOkr==0 && beka){
            System.out.println("Podane wyrażenie,"+s+"," +
                    "jest dobrze zapisane");
            System.out.println(beka);
        } else{
            System.out.println("Podane wyrażenie,"+s+"," +
                    "jest zle zapisane");
            System.out.println(beka);
        }

Ten kod jedynie zlicza nawiasy dodając jeden do sumy jak trafia na nawias otwierający, a odejmuje jeden od sumy, gdy trafi na zamykający. (dostępne nawiasy "(,[,{" )
Manipuluję zmienną beka, gdy najpierw wprowadzany jest nawias zamykający i w tym momencie ustawiam ją na false, czyli powinien być spełniony przypadek "else"(na samym koncu), ale jest odwrotnie, true występuje, gdy powinnien być false i na odwrót, jednak nie widzę miejsca, gdzie popełniam błąd. Mam nadzieje, że mimo zawiłego tłumaczenia z mojej strony jest to zrozumiałe.

Najprostszy przykład, dla którego to sprawdzałem to: ")2+3(", który podaję przez scanner, potem rozbijam to na tokeny, wrzucam na stos tylko tokeny zawierające nawiasy, a następnie ściągam te tokeny ze stosu tak jak w kodzie wyżej.

1

Stos to FILO. Czyli wrzucasz ) potem ( a wyciągasz od końca czyli najpierw ( potem ) wiec wtedy jest ok. Wyobraz sobie stos talerzy albo książek. To co wrzucisz na początku to ściągniesz na końcu a to co na końcu to ściągniesz na początku. Zamiast stacka użyj queue albo listy jakiejś (queue w cpp, a w javie na przykład linkedlist albo arraylist).

1 użytkowników online, w tym zalogowanych: 0, gości: 1