NEPLg2 Standard Library - stack
Web Playground
Web Playground

stack: 後入先出あといれさきだし(LIFO)スタックを扱うライブラリ

目的もくてき:

実装じっそう:

注意ちゅうい:

計算量けいさんりょう:

追加の使い方:

TEST
#entry main
#target std
#import "alloc/collections/stack" as *
#import "alloc/diag/error" as *
#import "core/option" as *
#import "core/field" as *
#import "core/result" as *
fn main <()*>i32> ():
    let st0 <Stack<i32>>:
        <Stack<i32>> new
        |> uwok
        |> push 10
        |> uwok
        |> push 20
        |> uwok
    let ok0 if eq len st0 2 1 0;
    let st1 <Stack<i32>>:
        <Stack<i32>> new
        |> uwok
        |> push 10
        |> uwok
        |> push 20
        |> uwok
    let ok1 match peek st1:
        Option::Some x:
            if eq x 20 1 0
        Option::None:
            0
    let st2 <Stack<i32>>:
        <Stack<i32>> new
        |> uwok
        |> push 10
        |> uwok
        |> push 20
        |> uwok
    let p pop st2;
    let ok2 match p:
        Option::Some x:
            if eq x 20 1 0
        Option::None:
            0
    let s01 <i32> add ok0 ok1;
    add s01 ok2

使い方:

TEST
#entry main
#target std
#import "alloc/collections/stack" as *
#import "alloc/string" as s
#import "alloc/diag/error" as *
#import "core/option" as *
#import "core/field" as *
#import "core/result" as *
fn main <()*>i32> ():
    let st <Stack<str>>:
        <Stack<str>> new
        |> uwok
        |> push "a"
        |> uwok
        |> push "b"
        |> uwok
    let p pop st;
    let ok0 match p:
        Option::Some x:
            if s::str_eq x "b" 1 0
        Option::None:
            0
    ok0

stack_header_len_ptr: ヘッダの length らん

目的もくてき

  • [len, cap, data_ptr] 形式けいしきのヘッダ領域りょういきから length らんMemPtr<i32> としてます。

実装じっそう

  • ヘッダ先頭せんとうの 4 byte を i32 らんとして解釈かいしゃくします。

注意ちゅうい

  • 公開こうかい API ではなく、Stack 内部ないぶ補助ほじょです。

計算量けいさんりょう

  • O(1)

stack_header_cap_ptr: ヘッダの capacity らん

目的もくてき

  • ヘッダちゅうの capacity らんMemPtr<i32> としてます。

実装じっそう

  • ヘッダ先頭せんとうから 4 byte すすめた位置いちi32 らんとしてあつかいます。

注意ちゅうい

  • 公開こうかい API ではなく、Stack 内部ないぶ補助ほじょです。

計算量けいさんりょう

  • O(1)

stack_header_data_ptr_ptr: ヘッダの data pointer らん

目的もくてき

  • データ領域りょういきの raw address を保持ほじするらんMemPtr<i32> としてます。

実装じっそう

  • ヘッダ先頭せんとうから 8 byte すすめた位置いちi32 らんとしてあつかいます。

注意ちゅうい

  • 公開こうかい API ではなく、Stack 内部ないぶ補助ほじょです。

計算量けいさんりょう

  • O(1)

stack_len_raw: 内部ないぶで length を

目的もくてき

  • Stack の length らんi32 としてみます。

実装じっそう

  • ヘッダの length らんを raw load_i32参照さんしょうします。

注意ちゅうい

  • 公開こうかい API ではなく、Stack 内部ないぶ補助ほじょです。

計算量けいさんりょう

  • O(1)

stack_cap_raw: 内部ないぶで capacity を

目的もくてき

  • Stack の capacity らんi32 としてみます。

実装じっそう

  • ヘッダの capacity らんを raw load_i32参照さんしょうします。

注意ちゅうい

  • 公開こうかい API ではなく、Stack 内部ないぶ補助ほじょです。

計算量けいさんりょう

  • O(1)

stack_data_ptr: 内部ないぶでデータ先頭せんとう

目的もくてき

  • Stack要素ようそ領域りょういき先頭せんとうMemPtr<.T> としてかえします。

実装じっそう

  • ヘッダに保持ほじした raw address をみ、MemPtr<.T>つつみます。

注意ちゅうい

  • 公開こうかい API ではなく、Stack 内部ないぶ補助ほじょです。

計算量けいさんりょう

  • O(1)

stack_new: 空のスタックを作る

目的もくてき

  • 既定きてい容量ようりょうからスタックを作成さくせいし、Stack<.T> としてかえします。

実装じっそう

  • 12 byte のヘッダ領域りょういきと、既定きてい容量ようりょうぶんの要素ようそ領域りょういき別々べつべつ確保かくほします。
  • ヘッダには [len, cap, data_ptr]保存ほぞんし、Stack<.T> はそのヘッダ先頭せんとう保持ほじします。

注意ちゅうい

  • 失敗しっぱいすると Result::Err Diagかえします。
  • かえStack<.T>内部ないぶヘッダの所有権しょゆうけんつので、不要ふようになったら stack_free解放かいほうします。

計算量けいさんりょう

  • 時間じかん計算量けいさんりょうは O(1)、追加ついか空間くうかん計算量けいさんりょうも O(1) です。

使い方:

TEST
#entry main
#target std
#import "alloc/collections/stack" as *
#import "alloc/diag/error" as *
#import "core/result" as *
fn main <()*>i32> ():
    let st <Stack<i32>>:
        stack_new<i32>
        |> uwok
    if stack_is_empty<i32> st 0 1

stack_push: 末尾に要素を積む

目的もくてき

  • item末尾まつびみ、更新後こうしんごのスタックをかえします。

実装じっそう

  • 容量ようりょうりる場合ばあい末尾まつび直接ちょくせつみます。
  • 容量ようりょう不足ぶそくなら 2 ばい拡張かくちょうし、realloc_ptr でデータ領域りょういき移動いどうしてから追加ついかします。

注意ちゅうい

  • 更新後こうしんごStack<.T>かえすので、がわ束縛そくばくなお必要ひつようがあります。
  • 拡張かくちょう発生はっせいした場合ばあい内部ないぶデータ領域りょういき番地ばんちわりえます。

計算量けいさんりょう

  • 償却しょうきゃく時間じかん計算量けいさんりょうは O(1)、拡張かくちょう発生時はっせいじ最悪さいあく時間じかん計算量けいさんりょうは O(n) です。

使い方:

TEST
#entry main
#target std
#import "alloc/collections/stack" as *
#import "alloc/diag/error" as *
#import "core/result" as *
fn main <()*>i32> ():
    let mut st <Stack<i32>>:
        stack_new<i32>
        |> uwok
    set st:
        stack_push<i32> st 10
        |> uwok
    if eq stack_len<i32> st 1 0 1

stack_pop: 末尾要素を取り出す

目的もくてき

  • 末尾まつび要素ようそし、存在そんざいすれば Option::Some としてかえします。

実装じっそう

  • len == 0 なら Option::Noneかえします。
  • 要素ようそがある場合ばあい最後さいご添字そえじ計算けいさんし、load 後に length を 1 らします。

注意ちゅうい

  • かえあたいOption<.T> です。
  • からスタックを異常いじょうにせず、Noneあらわします。

計算量けいさんりょう

  • 時間じかん計算量けいさんりょうは O(1) です。

使い方:

TEST
#entry main
#target std
#import "alloc/collections/stack" as *
#import "alloc/diag/error" as *
#import "core/option" as *
#import "core/result" as *
fn main <()*>i32> ():
    let st <Stack<i32>>:
        stack_new<i32>
        |> uwok
        |> stack_push<i32> 10
        |> uwok
    let p stack_pop<i32> st;
    match p:
        Option::Some x:
            if eq x 10 0 1
        Option::None:
            1

stack_peek: 末尾要素を覗く

目的もくてき

  • 末尾まつび要素ようそ削除さくじょせずに参照さんしょうしたいときに使つかいます。

実装じっそう

  • stack_pop同様どうよう最後さいご添字そえじもとめますが、length は更新こうしんしません。

注意ちゅうい

  • かえあたいOption<.T> です。
  • からスタックでは Noneかえします。

計算量けいさんりょう

  • 時間じかん計算量けいさんりょうは O(1) です。

使い方:

TEST
#entry main
#target std
#import "alloc/collections/stack" as *
#import "alloc/diag/error" as *
#import "core/option" as *
#import "core/result" as *
fn main <()*>i32> ():
    let st <Stack<i32>>:
        stack_new<i32>
        |> uwok
        |> stack_push<i32> 20
        |> uwok
    match stack_peek<i32> st:
        Option::Some x:
            if eq x 20 0 1
        Option::None:
            1

stack_len: 長さを返す

目的もくてき

  • 現在げんざい要素数ようそすうかえします。

実装じっそう

  • ヘッダ先頭せんとうの length らんむだけです。

注意ちゅうい

  • 変更へんこうともなわないり API です。

計算量けいさんりょう

  • 時間じかん計算量けいさんりょうは O(1) です。

使い方:

TEST
#entry main
#target std
#import "alloc/collections/stack" as *
#import "alloc/diag/error" as *
#import "core/result" as *
fn main <()*>i32> ():
    let mut st <Stack<i32>> uwok stack_new<i32>;
    set st uwok stack_push<i32> st 1;
    set st uwok stack_push<i32> st 2;
    if eq stack_len<i32> st 2 0 1

stack_is_empty: 空か判定する

目的もくてき

  • スタックがからかどうかを boolかえします。

実装じっそう

  • stack_len要素数ようそすうて 0 と比較ひかくします。

注意ちゅうい

  • 変更へんこうともなわないり API です。

計算量けいさんりょう

  • 時間じかん計算量けいさんりょうは O(1) です。

使い方:

TEST
#entry main
#target std
#import "alloc/collections/stack" as *
#import "alloc/diag/error" as *
#import "core/result" as *
fn main <()*>i32> ():
    let st <Stack<i32>> uwok stack_new<i32>;
    if stack_is_empty<i32> st 0 1

stack_clear: すべての要素を削除する

目的もくてき

  • 要素数ようそすうを 0 にもどし、スタックをからにします。

実装じっそう

  • ヘッダの length らんだけを書きえます。

注意ちゅうい

  • 確保かくほずみの容量ようりょう維持いじされ、メモリは解放かいほうされません。
  • 更新後こうしんごStack<.T>かえすので、がわ束縛そくばくなおします。

計算量けいさんりょう

  • 時間じかん計算量けいさんりょうは O(1) です。

使い方:

TEST
#entry main
#target std
#import "alloc/collections/stack" as *
#import "alloc/diag/error" as *
#import "core/result" as *
fn main <()*>i32> ():
    let mut st <Stack<i32>> uwok stack_new<i32>;
    set st uwok stack_push<i32> st 9;
    set st stack_clear<i32> st;
    if stack_is_empty<i32> st 0 1

stack_free: メモリを解放する

目的もくてき

  • Stack<.T>所有しょゆうするデータ領域りょういきとヘッダ領域りょういき解放かいほうします。

実装じっそう

  • capacity からデータ領域りょういきの byte すう計算けいさんして dealloc_ptr<.T>び、つづけてヘッダ 12 byte も解放かいほうします。

注意ちゅうい

  • 解放後かいほうごstk再利用さいりようしてはいけません。
  • Stack<.T>所有権しょゆうけん消費しょうひする終端しゅうたん操作としてあつかいます。

計算量けいさんりょう

  • 時間じかん計算量けいさんりょうは O(1) です。

使い方:

TEST
#entry main
#target std
#import "alloc/collections/stack" as *
#import "alloc/diag/error" as *
#import "core/result" as *
fn main <()*>i32> ():
    let st <Stack<i32>> uwok stack_new<i32>;
    stack_free<i32> st;
    0

new: stack_new の短縮名
push: stack_push の短縮名
pop: stack_pop の短縮名
peek: stack_peek の短縮名
len: stack_len の短縮名
is_empty: stack_is_empty の短縮名
clear: stack_clear の短縮名
free: stack_free の短縮名