dokończenie zadania nawiasy

0

Witam mam tutaj napisane zadanie nawiasy ale nie wiem jak je dokończyć aby program poprawnie wypisywał treść.

#include <bits/stdc++.h>
using namespace std;

int n;
string s, lista_otw;

bool otwierajacy(char c){
	return c=='(' or c=='[' or c=='{' or c=='<';
}

int typ_nawiasu(char c){
	if(c=='(' or c==')') return 1;
	if(c=='[' or c==']') return 2;
	if(c=='{' or c=='}') return 3;
	if(c=='<' or c=='>') return 4;
}

bool czy_poprawne_wyrazenie(string s){
	lista_otw="";
	for(int i=0; i<s.size(); i++){
		if(otwierajacy(s[i]))
			lista_otw = lista_otw + s[i];
		else
			if(lista_otw=="" or typ_nawiasu(lista_otw[lista_otw.size()-1])!=typ_nawiasu(s[i]))
				return 0;
			else
				lista_otw.erase(lista_otw.size()-1);
		}
		if(lista_otw.size()>0)
			return 0;
		return 1;
	}
	
int main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	char c;
	cin >> n >> c;
	cout << czy_poprawne_wyrazenie;
	return 0;
}

Wejście
W pierwszym wierszu wejścia znajduje się jedna liczba n (1 ≤ n ≤ 10). W kolejnych n wierszach znajduje
się po jednym wyrażeniu złożonym z nie więcej niż 1 000 000 znaków. Wyrażenie składa się
z nawiasów: (, ), { ,}, [, ], <, >.
Wyjście
W n wierszach standardowego wyjścia Twój program powinien zapisać jedną literę ‘T’ lub ‘N’,
oznaczającą poprawność zapisu nawiasów w wyrażeniu arytmetycznym.
Przykład
Dla danych wejściowych: poprawną odpowiedzią jest:
3
([]) T
<(>) N
{()()} T

z góry dziękuję za pomoc

2

Nie patrząc na algorytm, do samego wypisania T/N wystarczy:

cout << (czy_poprawne_wyrazenie ? "T" : "N");

(wyjście w przykładzie zawiera również powtórzone wyrażenie, ale co do zasady nie powinno być to potrzebne - to tylko taka konwencja.)

Co do reszty kodu - char c; to trochę za mało miejsca na całe wyrażenie :-) + powinieneś mieć jakąś pętlę wczytującą n razy to c (już po poprawie typu).

0

(na temat najwygodniej rozmawiać w postach)

mam rozumieć, że ta pętla powinna być w mainie?

Tak, w mainie.

0
Patryk27 napisał(a):

(na temat najwygodniej rozmawiać w postach)

mam rozumieć, że ta pętla powinna być w mainie?

Tak, w mainie.

ok dzięki wielkie

0

main jest nieprawidłowe. Powinno być:

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    size_t n;

    cin >> n;
    for (size_t i = 0; i < n; ++i) {
        std::string expresion;
        cin >> expresion;
        cout << "NT"[czy_poprawne_wyrazenie(std::move(expresion))] << '\n';
    }
    return 0;
}

https://godbolt.org/z/Pboco6WY9

Nie licząc tego, że pochrzaniłeś main to reszta wygląda całkiem całkiem jak na początkującego.
Niestety dysonans miedzy zawartością main i resztą karze mi podejrzewać, że jest co najmniej dwóch autorów.

Troszke poprawek w reszcie kodu: https://godbolt.org/z/KM6hboMcv

0

@david_turley
Byłoby super ekstra jakbyś dodał w typ_nawiasu() else lub bezwarunkowy return.

0
#include <iostream>
#include <string>
#include <cstring>
using namespace std;

int parencesKind(int ch)
{
	static const char parencesList[]="{}()[]<>";
	const char *found=strchr(parencesList,ch);
	if(found) return found-parencesList+2;
	return 0;
}

bool __isgood(string &str)
{
	int current=0,queue=-1,ch,kind=0;
	while((ch=str[current++])!='\0')
	{
		if(!(kind=parencesKind(ch))) continue;
		if((!(kind&1))&&((queue<0)||(str[queue-1]|1)!=kind)) str[queue++]=kind;
		else if(queue>=0) --queue;
		else return false;
	}
	return queue==-1;
}

bool isgood(string str) { return __isgood(str); }

int main()
{
	size_t n;
	cin>>n;
	for(string str;(n--)&&(getline(cin>>ws,str));) cout<<(__isgood(str)?"T":"N")<<endl;
	return 0;
}

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