
Геннадий
6 год назад
Дано N строк. Вывести для каждой строки Good, если она - правильное скобочное выражение и Bad, если нет.
ОТВЕТЫ

Терентьевич
Jul 8, 2019
Посмотрел решение на С++. Ну что же, я недаром зову его "полуассемблер" - нечего ему в общеобразовательных школах делать... Писать долго, много и непонятно для непосвященных. А сколько при этом можно ошибок сделать - просто жуть.
Вот для сравнения решение на Паскале. Я тоже использовал стек, чтобы проще было сравнивать)))
// PascalABC.NET 3.2, сборка 1370 от 24.12.2016
// Внимание! Если программа не работает, обновите версию!
function IsGood(s:string):Boolean;
begin
var St:=new Stacklt;chargt;;
foreach var c in s do
case c of
(:St.Push(c);
):if St.Countgt;0 then St.Pop
else begin Result:=false; Exit end;
end;
Result:=St.Count=0
end;
begin
var n:=ReadlnInteger(N=);
var s:=ReadArrString(n);
s.Select(x-gt;IsGood(x)).Select(x-gt;xGood:Bad).Println(NewLine)
end.
Контрольный пример (скобки "разбавлены" числами, чтобы было ясно, что программа не только скобки умеет читать, но и проверять их расстановку в произвольной строке)
N= 4
12(3)456(7)8
123((67)8)
12)34(5
(1(234)567
Good
Good
Bad
Bad
Вот для сравнения решение на Паскале. Я тоже использовал стек, чтобы проще было сравнивать)))
// PascalABC.NET 3.2, сборка 1370 от 24.12.2016
// Внимание! Если программа не работает, обновите версию!
function IsGood(s:string):Boolean;
begin
var St:=new Stacklt;chargt;;
foreach var c in s do
case c of
(:St.Push(c);
):if St.Countgt;0 then St.Pop
else begin Result:=false; Exit end;
end;
Result:=St.Count=0
end;
begin
var n:=ReadlnInteger(N=);
var s:=ReadArrString(n);
s.Select(x-gt;IsGood(x)).Select(x-gt;xGood:Bad).Println(NewLine)
end.
Контрольный пример (скобки "разбавлены" числами, чтобы было ясно, что программа не только скобки умеет читать, но и проверять их расстановку в произвольной строке)
N= 4
12(3)456(7)8
123((67)8)
12)34(5
(1(234)567
Good
Good
Bad
Bad
Для проверки, закрыты ли все скобки, можно было бы просто их посчитать, но мы будем проверять правильность вложенности. Для этого нам пригодится std::stack (да, и решаем на С++).
#include lt;iostreamgt;
#include lt;stackgt;
#include lt;stringgt;
using namespace std;
typedef unsigned short int USI;
bool hasCorrectBracing(string);
int main()
{
setlocale(0, ""); // кириллица
USI N;
cout lt;lt; "N = ";
cin gt;gt; N;
string row;
for(size_t i = 1; i lt;= N; i++)
{
cout lt;lt; "Строка " lt;lt; i lt;lt; ": ";
cin gt;gt; row;
if ( hasCorrectBracing(row) )
{
cout lt;lt; "Good\n";
}
else
{
cout lt; "Bad\n";
}
}
return 0;
}
bool hasCorrectBracing(string r)
{
stack lt;chargt; st;
for(string::size_type c = 0;
c lt; r.size();
c++)
{
if (r[c] == ()
{
st.push(();
continue;
}
else
{
if (r[c] == [)
{
st.push([);
continue;
}
else
{
if (r[c] == {)
{
st.push({);
continue;
}
}
} // end 1st if
if
(
(
(st.top() == ()
amp;amp;
(r[c] == ))
)
||
(
(st.top() == [)
amp;amp;
(r[c] == ])
)
||
(
(st.top() == {)
amp;amp;
(r[c] == })
)
)
{
st.pop();
} //end 2nd if
} // end for
if ( st.empty() )
{
return true;
}
else
{
return false;
}
} // end fun
#include lt;iostreamgt;
#include lt;stackgt;
#include lt;stringgt;
using namespace std;
typedef unsigned short int USI;
bool hasCorrectBracing(string);
int main()
{
setlocale(0, ""); // кириллица
USI N;
cout lt;lt; "N = ";
cin gt;gt; N;
string row;
for(size_t i = 1; i lt;= N; i++)
{
cout lt;lt; "Строка " lt;lt; i lt;lt; ": ";
cin gt;gt; row;
if ( hasCorrectBracing(row) )
{
cout lt;lt; "Good\n";
}
else
{
cout lt; "Bad\n";
}
}
return 0;
}
bool hasCorrectBracing(string r)
{
stack lt;chargt; st;
for(string::size_type c = 0;
c lt; r.size();
c++)
{
if (r[c] == ()
{
st.push(();
continue;
}
else
{
if (r[c] == [)
{
st.push([);
continue;
}
else
{
if (r[c] == {)
{
st.push({);
continue;
}
}
} // end 1st if
if
(
(
(st.top() == ()
amp;amp;
(r[c] == ))
)
||
(
(st.top() == [)
amp;amp;
(r[c] == ])
)
||
(
(st.top() == {)
amp;amp;
(r[c] == })
)
)
{
st.pop();
} //end 2nd if
} // end for
if ( st.empty() )
{
return true;
}
else
{
return false;
}
} // end fun
231
Смежные вопросы: