UnderwareDESIGN

PlayBASIC => Resources => Tutorials => Topic started by: kevin on January 14, 2006, 04:22:37 PM

Title: Stack - Data Structures
Post by: kevin on January 14, 2006, 04:22:37 PM
[pbcode]


; *=-------------------------------------------------------------------------=*
;
;   This example shows how you can roll some functions to treat arrays like
; stacks.  In this example were using a 1D integer array  for a data stack.
;
;  What is a stack ?
;  =================
;
;  Conceptually, a stack is simple: a data storage method that allows adding and
;  removing elements in a particular order. Every time an element is added,
;  it goes on the top of the stack, the only element that can be removed is
;  the element that was at the top of the stack.
;
;   Consequently, a stack is said to have "first in last out" behavior
;  (or "last in, first out"). The first item added to a stack will be the last
;  item removed from a stack.
;
; *=-------------------------------------------------------------------------=*


Dim MyStack(0)

Print "Pushed Data to stack"
For lp=0 to 10
; grab a random value to store on our MTSTack() array
 ThisValue=rnd(1000)  
; display the value so we can see it
    print ThisValue
; push it to the stack
    PushToStack(myStack(),ThisValue)
next



setcursor 0,200
print "STACK CONTENTS:"
print ShowStack(MyStack())




; Display the values off the stack
setcursor 0,300
Print "Popped values"

 For lp=1 to StackSize(MyStack())
 Print PopFromStack(MyStack())  
 next

Sync
waitkey



; =-----------------------------------------------------------------=*
;            Get the Size of this array stack
; =-----------------------------------------------------------------=*


FUnction StackSize(Array())
 Size=GetArrayElements(Array(),1)
EndFunction Size


;  Note, This example is generic (works on any 1D integer array) you
;        could easily optimize this to remove the constant resizing
;        by storing the current stack index/pointer in element zero
;        of the array.  Which is not used.. Same applies for the
;        cell copy, as you could simply store new cells at the end.
;
;         But that's an exercise for the user :)


; =-----------------------------------------------------------------=*
;            Push a Integer value onto our Stack array
; =-----------------------------------------------------------------=*


Function PushToStack(Array(),ThisValue)
; Get the current size of this array
 Size=GetArrayElements(Array(),1)

; redim it (resize) so it's one element bigger
 redim Array(size+1)  

; copy all existing cells (elements) down one stop to
; make room for inserting the new element at top
 CopyArrayCells   array(),size,-1,array(),size+1,-1,size

; insert the new Top element at array position #1
 array(1)=ThisValue
EndFunction


; =-----------------------------------------------------------------=*
;             Pop the top value off our Stack array
; =-----------------------------------------------------------------=*


Function PopFromStack(Array())
; Get the Arry of the stack array
 Size=GetArrayElements(Array(),1)
; check if there's at least 1 item in the stack
 if size>0
; grab the TOP item at array index #1
    ThisValue=Array(1)
; copy all the following cells Up.  So now element
; 2 is in element 1's position and so on
    CopyArrayCells  array(),1,1,array(),0,1,size
      ; reduce the arrays size by 1 element
    redim Array(size-1)  
 endif
EndFunction ThisValue



; =-----------------------------------------------------------------=*
;        Build a string of the stack contents for displaying
; =-----------------------------------------------------------------=*

Function ShowStack(Array())
 Size=GetArrayElements(Array(),1)
 if size>0
    for lp=1 to size
   s$=s$+str$(Array(lp))
   if lp<>size then s$=s$+","
    next
 endif
EndFunction s$


[/pbcode]



Return To PlayBasic Tutorial Index (http://www.underwaredesign.com/forums/index.php?topic=2552.0)