hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
ラボ/スタック - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

ラボ

スタック

データ構造

イメージ図

リスト構造の1種で値の出し入れをリストの先頭のみで行うデータ構造。
スタックでの先頭とは配列の添え字の大きい方を指し、添え字0は末尾にあたる。

実装例

配列変数を利用

filestack[sp].as
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
!
-
|
|
|
!
 
 
 
 
 
 
 
-
|
!
-
|
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
!
 
 
 
 
 
 
-
|
!
 
 
 
 
/******************************************************************************
 *                                                                            *
 *                            データ構造:スタック                            *
 *                                                                            *
 ******************************************************************************/
 
    #module "stack"
 
    ;-----------------------------------------------------------------------
    ; スタックを登録する
    ;-----------------------------------------------------------------------
    #deffunc sck_ini val
        mref rslt,64
        mref stack,48           ; スタック
        mref pval,1024          ; スタックの大きさ
        size=pval.2
        ptr=0
        rslt=size
        return
    ;-----------------------------------------------------------------------
    ; 登録したスタックから値を取り出す
    ;-----------------------------------------------------------------------
    #deffunc sck_pop val
        mref rslt,64
        mref n,16
        if ptr=0{
            rslt=1
        }
        else{
            ptr--
            n=stack.ptr
            rslt=0
        }
        return
    ;-----------------------------------------------------------------------
    ; 登録したスタックに値を入れる
    ;-----------------------------------------------------------------------
    #deffunc sck_push int
        mref rslt,64
        mref n,0
        if ptr=size{
            rslt=1
        }
        else{
            stack.ptr=n
            ptr++
            rslt=0
        }
        return
    #global
 
/* -------------------------------------------------------------------------- *
 *                                                                            *
 *                           S A M P L E                           *
 *                                                                            *
 * -------------------------------------------------------------------------- */
    randomize
    dim ary,5       ; スタックにする変数
    sck_ini ary     ; 変数をスタックに登録
    
    mes "スタックサイズ ==> "+stat+"\n"
 
    ; スタックに乱数を入れる
    repeat
        rnd n,100
        sck_push n
        if stat!0{
            mes "スタックがいっぱいです.\n" : break
        }
        mes "スタックに入れた値 ==> "+n
    loop
 
    ; スタックから取り出す
    repeat
        sck_pop n
        if stat!0{
            mes "スタックが空です.\n" : break
        }
        mes "スタックから出した値 ==> "+n
    loop
 
    stop

モジュール変数を利用

モジュール変数を使えば数値や文字列をごっちゃにして管理可能。 [hsp3]

filestack4hsp3.hsp
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
!
 
 
 
 
 
 
// モジュール変数を利用したスタック
// 整数・実数・文字列を区別せずpush可能
 
// スタックの要素
#module stack_element value
#modinit var p1
    value = p1
    return
 
#modfunc get var p1
    p1 = value
    return
#global
 
// スタック要素管理用モジュール
#module stack_maneger
#deffunc _push
    newmod stack_elements, stack_element, v
    index++
    return 0
 
#deffunc pop var p1
    if ( index == 0 ) {
        logmes "スタックが空です"
        return -1                   // エラー時は stat に -1 を返す
    }
    index--
    get stack_elements( index ), p1
    delmod stack_elements( index )
    return 0
#global
#define push( %1 ) v@stack_maneger = %1 : _push

以下サンプル。

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
#include "stack4hsp3.hsp"
    vartype_name = "", "", "文字列型", "実数型", "整数型"
    repeat 10
        i = rnd( 10 )
        var_type = rnd( 3 ) + 2
        switch var_type
            case 4
                push i
                swbreak
            case 3
                i = double( i )
                push i
                swbreak
            case 2
                push str( i )
                swbreak
        swend
        mes vartype_name( var_type ) + "の" + i + "をpushしました。"
    loop
    mes "-"
    repeat
        pop a
        if stat < 0 : break
        mes vartype_name( vartype( a ) ) + "の" + a + "をpopしました。"
    loop
    stop

コメント

  • やっぱりデータ構造の基本だから・・・。
    モジュールとして実装してみました。使用する人によっていろいろな仕様に出来そうです。 -- kz3 2005-07-21 18:37:17 (木)
  • データ構造の説明に絵もあると分かりやすいんだろうけど、普通のペイントソフトだと画像が荒くなる・・・;;
    GENKIさんが座標とピクセルに貼ったような滑らかな画像が・・・ -- kz3 2005-07-22 04:15:28 (金)
  • あれwindows付属のペイントですよ。画像が粗くなるのはjpegかpngの違いでは…。 -- GENKI? 2005-08-24 23:15:06 (水)
  • ええぇ!?ちょっとまってください^^; -- kz3 2005-08-25 03:49:22 (木)
  • イメージ図作成。でも「スタック」で検索すればどこでも出てくるし、容量詰めちゃってあれかなぁ・・・。反応よければ他のも追加していきますが^^; -- kz3 2005-09-08 14:24:51 (木)

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

添付ファイル:
filestack4hsp3.hsp
436件 [詳細]
filestack[sp].as
538件 [詳細]
fileimgStack.png
651件 [詳細]
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2007-07-30 (月) 16:32:36 (2323d)