Pomoc w zadaniu Wyrażenia nawiasowe

0

Proszę o pomoc w zadaniu przedstawionym poniżej.

Wyrażenia nawiasowe
Wyrażeniem nawiasowym nazywamy napis złożony wyłącznie ze znaków '(' i ')'. Wyrażenie nawiasowe nazwiemy poprawnym jeśli w każdym miejscu liczba poprzedzających to miejsce nawiasów '(' jest niemniejsza niż liczba poprzedzających nawiasów ')', oraz łączne liczby nawiasów ')' i '(' występujących w wyrażeniu są równe. Zadaniem Twojego programu jest stwierdzenie czy zadane wyrażenia nawiasowe są poprawne. Wygodnie będzie w tym celu stworzyć funkcję, która będzie badała poprawność zadanego wyrażenia nawiasowego.

Zadanie
Napisz program, który:

wczyta ze standardowego wejścia liczbę naturalną n oraz napisy s1,s2,...,sn.
dla każdego napisu stwierdzi czy jest on poprawnym wyrażeniem nawiasowym i wypisze wynik na standardowe wyjście.

Wejście
W pierwszym wierszu wejścia znajduje się liczba naturalna 1<=n<=10000 oznaczającą liczbę napisów. W i+1szym wierszu znajduje się napis si. Dlugość napisu jest dodatnia oraz nie przekracza 255 znakow.

Wyjście
Wi +1-szym wierszu wyjścia należy wypisać "TRUE" jeśli napis s jest poprawnym wyrażeniem nawiasowym lub "FALSE" w przeciwnym wypadku.

Przykład
Dla danych wejściowych:

4
(main)
(()(
())(())
(()())
poprawną odpowiedzią jest:

FALSE
FALSE
FALSE
TRUE

2

Pokazałeś zadanie ale... gdzie jest Twoje pytanie? Jaki masz problem z tym zadaniem? Pokaż co napisałeś do tej pory.

1

Napisałbym pętle, która porównuje ilość nawiasów otwartych i zamkniętych. Tylko nie wiem jak to zrobić.

Możesz wczytywać wejście znak po znaku. Poszukaj funkcji która pobiera jeden znak z stdin.
Inny sposób to wczytanie od razu całej linii i operowanie na znakach w pamięci. Poszukaj funkcji wczytującej linię z stdin.

0

Najlepiej zacznij od: https://wandbox.org/permlink/2rv3R6VHtDyHbIHx

#include <iostream>
#include <string>

bool isParenthesisExpr(const std::string& s)
{
    // TODO
    return false;
}

int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    size_t n;
    std::cin >> n;
    
    std::string s;
    while(n-- && std::cin >> s) {
        std::cout << (isParenthesisExpr(s) ? "TAK\n" : "NIE\n");
    }
    
    return 0;
}
0

Nawiasy są niedopasowane wtedy i tylko, gdy:

  • zamkniesz jakiś nieotwarty nawias
  • pod koniec linii zostaną niezamknięte nawiasy
0
int count=0;
for(char ch;cin.get(ch)&&((ch=='(')||(ch==')'));) if(ch==')') ++count; else if(count>0) --count; else return false;
return !count;

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