V diplomce jsem řešil takový problém, mám program reprezentovaný stromem, který mám kvůli rychlosti v řetězci. Strom může vypadat například takto:
div((add((div((X1), (X0))), (X1))), (add((add((X0), (X2))), (X1))))
Což kdyby se převedlo na matematický výraz, tak bude vypadat následovně:
((X1/X0)*X1)/((X0*X2)*X1), kde X0, X1, X2 jsou proměnné
No a z toho stromu jsem potřeboval získat všechny podstromy, včetně těch, které mají pouze kořen. No a povedlo se tímto kódem:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections;
namespace Pokusy
{
class Program
{
static void Main(string[] args)
{
List list = new List();
string s = "div((add((div((X1), (X0))), (X1))), (add((add((X0), (X2))), (X1))))";
foreach (Match m in Regex.Matches(s, @"(\w+)"))
{
if (Regex.IsMatch(m.ToString(), @"^X[\d+]$"))
{
Console.WriteLine(m.ToString());
}
else
{
Console.Write(m.ToString());
GetLists(s.Substring(m.Index));
}
}
Console.ReadLine();
}
private static string GetLists(string s)
{
if (s.Contains("("))
{
char[] array = s.ToCharArray();
int startIndex = 0;
int endIndex = 0;
int braces = 0;
for (int i = 0; i < array.Length; i++)
{
if (array[i].ToString() == "(" && startIndex == 0)
{
startIndex = i;
}
else if (array[i].ToString() == "(" && startIndex > 0)
{
braces++;
}
else if (array[i].ToString() == ")" && startIndex > 0)
{
if (braces == 0)
{
endIndex = i + 1;
i = array.Length;
}
braces--;
}
}
string left = "";
left = s.Substring(startIndex, endIndex - startIndex);
Console.WriteLine(left);
return left;
}
return "";
}
}
}
Příspěvek vyšel v Sobotu 7.3.2009 18:10 v kategorii Programování a byl 22098x zobrazen. Pokud se vám líbil můžete si jej zalinkovat: Linkuj.cz, Del.icio.us
"A jedeme dál ..." Človíčkův Weblog aneb Michal Horák bloguje. (c) Michal Horák (Človíček webdesign) 2006