Merhaba,
Aşağıda bir garip yığıt yapısı ve hemen altında deneme kodu yer almakta...:)
Kısaca;
- Bu yapıyı bir dizi gibi hayal etmeliyiz. Ama kuramsal olarak başlangıç ve bitiş değerleri sonsuz!
- Başlangıç (daha doğrusu sol kenar boşluğu ~ offset), bizim tarafımızdan kurulurken belirleniyor.
- Sağ tarafı (dizinin devamı) ise boşluk ve değerleri de her zaman sıfır olmak zorunda,
- Çünkü bunlar (sol ve sağı veya alt ve üstü) sanal değerler ve olmayan bu değerlere erişilirken dizi gibi hata vermiyor...
- Doğal olarak hata vermemesine karşın hiç bir değere de eşitlenemiyor...:)
Dedik ya bir garip yığıt ama yerine göre çok işe yarayabilir...
struct birGaripYığıt
{
private:
int[] stack;
size_t _Index;
size_t _Offset;
this (size_t realLen, size_t diffLen = 0)
{
stack = new int[realLen];
_Offset = diffLen;
//_Index = index();
}
public size_t index() @property
{
return stack.length + _Offset -1;
}
public void set(size_t len, int data) @property
{
if((len >= _Offset) &
(len <= index()))
{
stack[len - _Offset] = data;
}
}
public int get(size_t len) @property
{
if((len >= _Offset) &
(len <= index()))
{
return stack[len - _Offset];
}
return 0;
}
enum empty = false;
void popFront()
{
_Index++;
}
int front()
{
return get(_Index);
}
}
import std.stdio;
void main() {
int[] testArray = [ -3, -2, -1, 0, 1, 2, 3 ]; // 4 <-- SONRADAN EKLENEN VERİ
// YAZILMAYAN VERİ -------------^ ^------- YAZILAN VERİ
with(birGaripYığıt (10, 4))
{
index().writeln; // kurucu parametre toplamlarının 1 eksiği
foreach(index, data; testArray)
{
set(index, data); // test dizisini yapıdaki diziye yerleştir
}
get(4).writeln; // yapının gerçek ilk elemanını döndürür
set(index(), 4);
get(index()).writeln; // yapının gerçek son elemanını döndürür
}
}
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]