// A generic stack record backed by a vector.
import std.io.println;
import std.text.number;
type Stack<T> = { items: vector T };
def new_stack<T>(): Stack<T> {
let empty: vector T = [];
let stack: Stack<T> = { items: empty };
return stack;
}
def push<T>(stack: &mutable Stack<T>, item: T): void {
append((*stack).items, item);
}
def size<T>(stack: &Stack<T>): uint {
return length((*stack).items) as uint;
}
def top<T>(stack: &Stack<T>): option T {
let count: uint = size(stack);
if (count == 0) { return option.none(); };
return option.some(clone(&(*stack).items[count - 1]));
}
def main(): int {
let numbers: mutable Stack<int> = new_stack();
push(&mutable numbers, 10);
push(&mutable numbers, 20);
push(&mutable numbers, 30);
println(uint_to_text(size(&numbers)));
match top(&numbers) with
| option.some(value) -> { println(int_to_text(value)); }
| option.none -> { println("empty"); };
return 0;
}// سجل مكدس عام يعتمد على متجه.
استورد std.io.println;
استورد std.text.number;
نوع مكدس<ق> = { العناصر: متجه ق };
عرف أنشئ_مكدسا<ق>(): مكدس<ق> {
دع الفارغ: متجه ق = [];
دع المكدس: مكدس<ق> = { العناصر: الفارغ };
أرجع المكدس;
}
عرف ادفع_إلى<ق>(المكدس: &متغير مكدس<ق>, العنصر: ق): فراغ {
ألحق((*المكدس).العناصر, العنصر);
}
عرف الحجم<ق>(المكدس: &مكدس<ق>): طبيعي {
أرجع الطول((*المكدس).العناصر) مثل طبيعي;
}
عرف القمة<ق>(المكدس: &مكدس<ق>): اختياري ق {
دع العدد: طبيعي = الحجم(المكدس);
إذا (العدد == 0) { أرجع اختياري.لا_شيء(); };
أرجع اختياري.موجود(استنسخ(&(*المكدس).العناصر[العدد - 1]));
}
عرف الرئيسية(): عدد {
دع الأعداد: متغير مكدس<عدد> = أنشئ_مكدسا();
ادفع_إلى(&متغير الأعداد, 10);
ادفع_إلى(&متغير الأعداد, 20);
ادفع_إلى(&متغير الأعداد, 30);
اطبع_سطر(طبيعي_إلى_نص(الحجم(&الأعداد)));
طابق القمة(&الأعداد) مع
| اختياري.موجود(القيمة) -> { اطبع_سطر(عدد_إلى_نص(القيمة)); }
| اختياري.لا_شيء -> { اطبع_سطر("فارغ"); };
أرجع 0;
}
Run it
With the interpreter, without compiling:
./build/sultanc run examples/en/generics/stack.snOr compile it to an executable:
./build/sultanc examples/en/generics/stack.sn -o build/example && ./build/example