Zdravim,
mám takovej problém, mám napsat program na kontrolu uzávorkování, což neni, nebo neměl by bejt takovej problém, jen (samozřejmě nevim proč) mi moje řešení vrací někdy špatný výsledky. Vstupy neznám.
Myslim, že je důležitý podotknout, že aplikace je testovaná v prostředí Mono pod Linuxem, takže řádky jsou ukončený pouze znakem #10 LF.
Zadání
Na vstupu je dána posloupnost libovolných znaků, mezi kterými se vyskytují kulaté (), hranaté [], špičaté <> a složené {} závorky.
Zjistěte, zda je posloupnost správně uzávorkovaná -- tzn. že každá otevítací závorka má korespondující zavírací závorku
a že závorky se nekříží. Není-li posloupnost správně uzávorkovaná, vypište na standardní výstup index znaku,
na kterém nastala chyba (první znak má index 1). V opačném případě vypište 0. Pokud se závorky nekříží, ale nějaká zůstane otevřená,
vraťte index znaku, který následuje za posledním (tzn. celkový počet znaků + 1).
Pozn: Pokud nečtete vstup po znacích, předpokládejte, že zalomení řádku jsou reprezentována pouze znakem LF
(ASCII hodnota 10) - tzn. zabírají právě jeden znak.
Můj kód je tenhle.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace spravne_uzavorkovani
{
class Program
{
static bool jeZavorkaOtviraci(char znak)
{
string zavorky = "([<{";
if (zavorky.Contains(znak)) return true;
else return false;
}
static char jeZavorkaZaviraci(char znak)
{
string zavorky = ")]>}";
if (zavorky.Contains(znak))
{
switch (znak)
{
case ')':
return '(';
case ']':
return '[';
case '>':
return '<';
case '}':
return '{';
default: return '0';
}
}
else return '0';
}
static void Main(string[] args)
{
Stack<char> zasobnik = new Stack<char>();
int i = 0;
int c = Console.Read();
while (c != 10 && c != 13)
{
char z = (char)c;
i++;
if (jeZavorkaOtviraci(z)) zasobnik.Push(z);
else
{
char znak = jeZavorkaZaviraci(z);
if (znak != '0')
{
try
{
if (znak != zasobnik.Pop())
{
Console.WriteLine(i);
Console.ReadKey();
return;
}
}
catch (Exception)
{
Console.WriteLine(i);
Console.ReadKey();
return;
}
}
}
c = Console.Read();
}
if (zasobnik.Count > 0)
{
Console.WriteLine(i+1);
}
else Console.WriteLine(0);
Console.ReadKey();
}
}
}
díky za rady.