Alıntı (acehreli):
> Biz ise okuduktan sonra o ifadeyi işletmek istiyorsun sandık. :)
Doğru düşünmüşsünüz :)
Gene de benim sormak istediğim girişten gelen ifadeyi parçalara ayırmakla ilgiliydi.
Bahsettiğiniz programı Dijkstra'nın iki yığıt kullanan algoritmasını kullanarak yazdığımızda buna benziyor.
import std.stdio;
import std.string;
import std.array;
import std.math;
import std.conv;
class Yığıt(T)
{
private T[] elemanlar;
@property bool boşMu() { return elemanlar.empty(); }
void ekle(T üstteki) { elemanlar ~= üstteki; }
T çıkar()
{
if (this.boşMu)
throw new Exception("Boş yığıt.");
auto üstteki = elemanlar.back;
elemanlar.popBack();
return üstteki;
}
}
string boslukluMetin(string metin)
{
string sonuc;
for (int i = 0; i < metin.length; ++i)
{
if (metin[i] == '(')
sonuc ~= "( ";
else if (metin[i] == ')')
sonuc ~= " ) ";
else if (metin[i] == '+')
sonuc ~= " + ";
else if (metin[i] == '*')
sonuc ~= " * ";
else if (metin[i] == '/')
sonuc ~= " / ";
else if (metin[i] == 'k')
{
sonuc ~= " kök ";
i += 3;
}
else if (metin[i] == '\n')
{
}
else
sonuc ~= metin[i];
}
return sonuc;
}
void main()
{
auto işleçler = new Yığıt!string();
auto değerler = new Yığıt!double();
auto sonuc = split(boslukluMetin(readln()).idup);
foreach (harf; sonuc)
{
if (harf == "(") {}
else if (harf == "+" || harf == "-" || harf == "*" || harf == "/" || harf == "kök")
işleçler.ekle(harf);
else if (harf == ")")
{
auto işleç = işleçler.çıkar();
double değer = değerler.çıkar();
if (işleç == "+") değer += değerler.çıkar();
else if (işleç == "-") değer -= değerler.çıkar();
else if (işleç == "*") değer *= değerler.çıkar();
else if (işleç == "/") değer /= değerler.çıkar();
else if (işleç == "kök") değer = sqrt(değer);
değerler.ekle(değer);
}
else değerler.ekle(to!double(harf));
}
writeln(değerler.çıkar());
}
Yalnız benim merak ettiğim konu örneğin C stili dizilerde yığıt gerçeklemesini dizi kullanarak yapıldığı zaman her eleman eklendiğinde dizinin boyutunu bir arttırırsak o zaman yığıtın performansı düşüyor.
Bunun yerine diziye her eleman eklendiğinde sığayı iki katına çıkarıp, eleman çıkarıldığında ise dizi boyutu 1/4'üne kadar düştüğünde diziyi tekrar boyutlandırarak daha hızlı çalışan bir yığıt algoritması oluşturmuş oluyoruz.
Acaba D'deki durum da bu şekilde mi.
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]