forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Полезные функции (http://forum.boolean.name/forumdisplay.php?f=17)
-   -   Stack и Map (http://forum.boolean.name/showthread.php?t=18060)

Nerd 06.04.2013 22:21

Stack и Map
 
Хранят строки.
Код:


;;;;;;;;;;;;;;;;;;;;;;;; DATA STRUCTURES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;-------------- MAP data type ---------------------------------------------------

Type TMap
        Field members ;bank with handles of records
        Field pntr ;bank pointer (-4 - empty)
        Field rel_size ;size of bank realloc
End Type

        Type TMap_r ;map record
                Field name$,dat$
        End Type


Function CreateMap.TMap(rs=64)
        map.TMap = New TMap
                map\members = CreateBank(rs)
                map\rel_size = rs
                map\pntr = -4
        Return map
End Function


        Function TMap_Insert(map.TMap,name$,dat$)
                Local r.TMap_r
                If (map\pntr<>-4)
                        For i = 0 To pntr Step 4
                                r = Object.TMap_r(PeekInt(map\members,i))
                                If r\name = name Then
                                        r\dat = dat
                                        Return
                                EndIf
                        Next
                EndIf
                        r = New TMap_r
                        r\name = name
                        r\dat = dat
                                If (map\pntr+8)>BankSize(map\members) Then
                                        ResizeBank(map\members,map\pntr+map\rel_size)
                                EndIf
                        map\pntr = map\pntr + 4
                        PokeInt(map\members,map\pntr,Handle(r))
        End Function
       
       
Function TMap_Get$(map.TMap,name$)
                Local r.TMap_r
        If (map\pntr<>-4)
                For i = 0 To map\pntr Step 4
                        r = Object.TMap_r(PeekInt(map\members,i))
               
                        If r\name = name Then
                                Return r\dat
                        EndIf
                Next
        EndIf
End Function

        Function TMap_Remove(map.TMap,name$) ;remove record
                        Local r.TMap_r
                        Local moveback
                If (map\pntr<>-4)
                        For i = 0 To map\pntr Step 4
                                If moveback Then
                                        PokeInt(map\members,map\pntr, PeekInt(map\members,map\pntr+4) )
                                       
                                Else
                                        r = Object.TMap_r(PeekInt(map\members,i))
                                                If r\name = name Then
                                                        Delete r
                                                        map\pntr = map\pntr - 4
                                                        moveback = 1
                                                        i = i - 4
                                                EndIf
                                EndIf
                        Next
                EndIf
        End Function

        Function TMap_Delete(map.TMap)
                        Local r.TMap_r
                If (map\pntr<>-4)
                        For i = 0 To map\pntr Step 4
                                r = Object.TMap_r(PeekInt(map\members,i))
                                Delete r
                        Next
                EndIf
                        FreeBank map\members
                Delete map
        End Function
       
       
       
;------------------ STACK data type ---------------------------------------------------

Type TStack
        Field members
        Field pntr
        Field rel_size
End Type

        Type TStack_r
                Field dat$
        End Type


Function CreateStack.TStack(rs=64)
        st.TStack = New TStack
                st\members = CreateBank(rs)
                st\rel_size = rs
                st\pntr = -4
        Return st
End Function


        Function TStack_Push(st.TStack,dat$)
                Local r.TStack_r
                        r = New TStack_r
                        r\dat = dat
                                If (st\pntr+8)>BankSize(st\members) Then
                                        ResizeBank(st\members,st\pntr+st\rel_size)
                                EndIf
                        st\pntr = st\pntr + 4
                        PokeInt(st\members,st\pntr,Handle(r))
        End Function
       
       
        Function TStack_Pop$(st.TStack)
                        Local r.TStack_r,res$
                If (st\pntr<>-4)
                        r = Object.TStack_r(PeekInt(st\members,st\pntr))
                                res = r\dat
                        Delete r
                        st\pntr = st\pntr - 4
                                Return res
                EndIf
        End Function
 
                Function TStack_GetLast$(st.TStack)
                                Local r.TStack_r
                        If (st\pntr<>-4)
                                r = Object.TStack_r(PeekInt(st\members,st\pntr))
                                Return r\dat
                        EndIf
                End Function
       
                Function TStack_Get$(st.TStack,n)
                                Local r.TStack_r
                        If (st\pntr<>-4) And n>-1 And n*4<(st\pntr-1)
                                r = Object.TStack_r(PeekInt(st\members,n*4))
                                Return r\dat
                        EndIf
                End Function
               
                                Function TStack_Remove(st.TStack,n) ;remove record
                                                Local r.TStack_r
                                                Local moveback
                                        If (st\pntr<>-4) And n>-1 And n*4<(st\pntr-1)
                                                For i = 0 To st\pntr Step 4
                                                        If moveback Then
                                                                PokeInt(st\members,i,PeekInt(st\members,i+4) )
                                                        Else
                                                                r = Object.TStack_r(PeekInt(st\members,i))
                                                                        If i = n*4 Then
                                                                                Delete r
                                                                                st\pntr = st\pntr - 4
                                                                                moveback = 1
                                                                                i = i - 4
                                                                        EndIf
                                                        EndIf
                                                Next
                                        EndIf
                                End Function
                       
                                Function TStack_Delete(st.TStack)
                                                Local r.TStack_r
                                        If (st\pntr<>-4)
                                                For i = 0 To st\pntr Step 4
                                                        r = Object.TStack_r(PeekInt(st\members,i))
                                                        Delete r
                                                Next
                                        EndIf
                                                FreeBank st\members
                                        Delete st
                                End Function
               
       
       
       
       
       
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Пример:
Код:

m.TMap = CreateMap()

TMap_Insert(m,"banana","...")
TMap_Insert(m,"banana","phone")
TMap_Insert(m,"hue","hue")

Print TMap_Get(m,"banana")

TMap_Remove(m,"hue")
Print TMap_Get(m,"hue")

TMap_Delete(m)



s.TStack = CreateStack()

TStack_Push(s,"banana1")
TStack_Push(s,"banana2")
TStack_Push(s,"banana3")
TStack_Push(s,"banana4")
TStack_Push(s,"banana5")

Print TStack_Pop(s)
Print TStack_Pop(s)
Print TStack_GetLast(s)
Print TStack_Pop(s)
Print TStack_Get(s,2)



WaitKey
End

:ok:


Часовой пояс GMT +4, время: 17:50.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot