' LIFO- Last In, First Out or push-down stack nomainwin WindowWidth =1000 WindowHeight = 420 UpperLeftX = 50 UpperLeftY = 50 open "Display Stack- push in 45 items -here, random integers- then pop them out.." for graphics_nsb as #w #w "trapclose quit" #w "down ; color red ; backcolor lightgray ; size 16 ; fill lightgray" #w "place 100 40" #w "font arial 36 bold" #w "\Pushing down onto stack...." #w "font arial 10" global Stack$, j StackLimit =45 j = 0 Stack$ ="TOS" ' will hold space-separated contents of stack. ' TOS =TopOfStack sentinel. calldll #kernel32, "Sleep", 5000 as long, ret as void for i =1 to StackLimit RandTerm =int( 100 *rnd( 1)) ' push new value as integer 0 --> 99 Stack$ =str$( RandTerm) +" " +Stack$ call display next i #w "cls" #w "font arial 36 bold" #w "place 100 40" #w "\Popping off top of stack...." #w "font arial 10" for i =1 to StackLimit ' pop top term off stack p =instr( Stack$, " ") Stack$ =mid$( Stack$, p +1) call display next i #w "cls ; font arial 36 bold ; place 100 40" #w "\Stack empty again." wait ' In IM & corrct directory, use cmd 'convert -delay 50 scr*.bmp anim.gif'. sub quit handle$ close #w end end sub sub display #w "cls" k =1 [here] entry$ =word$( Stack$, k, " ") if entry$ <>"TOS" then entry =val( entry$) #w "place "; k *20; " 350" #w "color "; entry *255 /100; " 255 "; 255 -entry *255 /100 #w "goto "; k *20; " "; 350 -( entry *3) #w "color red" #w "place "; k *20 -5; " "; 350 -( entry *3) -10 #w "\"; entry #w "place "; k *20 -5; " 370" #w "\"; k k =k +1 end if if entry$ <>"TOS" then goto [here] j =j +1 #w "flush" #w "getbmp scr 1 1 980 390" bmpsave "scr", "C:\IM\scr"+ right$( "000" +str$( j), 3) +".bmp" unloadbmp "scr" 'calldll #kernel32, "Sleep", 500 as long, ret as void timer 500, [on] wait [on] timer 0 end sub
' LIFO- Last In, First Out or push-down stack nomainwin WindowWidth = 300 WindowHeight = 620 UpperLeftX = 50 UpperLeftY = 50 open "String Stack" for graphics_nsb as #w #w "trapclose quit" #w "down ; size 16" #w "place 10 40" #w "font arial 12 bold" #w "\Pushing down onto stack...." #w "font arial 10" global Stack$, j InTxt$ ="2 3 4 + * . FORTH rules KO. It was a wild and windy night and Dick the shepherd said to his mates, 'Tell us a story.'" StackLimit =28 ' for the above text... j = 0 Stack$ ="TOS" ' will hold space-separated contents of stack. ' TOS =TopOfStack sentinel. calldll #kernel32, "Sleep", 5000 as long, ret as void for i =1 to StackLimit ' push new value as string Stack$ =word$( InTxt$, i, " ") +" " +Stack$ call display next i #w "cls" #w "font arial 12 bold" #w "place 10 40" #w "\Popping off top of stack...." #w "font arial 10" for i =1 to StackLimit ' pop top term off stack p =instr( Stack$, " ") Stack$ =mid$( Stack$, p +1) call display next i #w "cls ; font arial 12 bold ; place 10 40" #w "\Stack empty again." wait ' In IM & correct directory, use cmd 'convert -delay 50 scr*.bmp anim.gif'. sub quit handle$ close #w end end sub sub display #w "cls" k =1 [here] entry$ =word$( Stack$, k, " ") if entry$ <>"TOS" then #w "place 50 "; k *20 +15 #w "\"; entry$ k =k +1 end if if entry$ <>"TOS" then goto [here] j =j +1 #w "flush" #w "getbmp scr 1 1 120 620" bmpsave "scr", "C:\IM\scr"+ right$( "000" +str$( j), 3) +".bmp" unloadbmp "scr" 'calldll #kernel32, "Sleep", 500 as long, ret as void timer 500, [on] wait [on] timer 0 end sub
This example shows push-and-pop.
' LIFO- Last In, First Out or push-down stack nomainwin cr$ =chr$( 13) WindowWidth = 550 WindowHeight = 690 UpperLeftX = 50 UpperLeftY = 50 graphicbox #w.gb1, 210, 110, 120, 520 textbox #w.tb1, 210, 40, 120, 30 button #w.b1, "Push", [push], LR, 370, 590 button #w.b1, "Pop ", [pop], LR, 170, 590 statictext #w.st1, "Type in the textbox and click" +cr$ +" 'Push'" +cr$ +" to put an entry on the stack, pushing everything else down.", 30, 120, 150, 400 statictext #w.st2, "Click" +cr$ +" 'Pop'" +cr$ +" to pull an entry off the stack, and move everything else up.", 350, 120, 150, 400 global Stack$, k Stack$ ="EOS" ' will hold space-separated contents of stack. ' EOS =EndOfStack sentinel. open "Stack" for graphics as #w #w "trapclose quit" #w.gb1 "down" #w.gb1 " font arial 16" #w.tb1 "!font arial 16" #w.tb1 "Empty!" wait [push] #w.tb1 "!contents? inp$" ' push new value if inp$ <>"" then Stack$ =inp$ +" " +Stack$ call display #w.tb1 "" #w.tb1 "!setfocus" end if scan wait [pop] trm$ =word$( Stack$, 1, " ") if trm$ <>"EOS" then #w.tb1 trm$ ' pop top term off stack p =instr( Stack$, " ") Stack$ =mid$( Stack$, p +1) call display else #w.tb1 "Empty!" end if scan wait ' ____________________________________________________________ sub quit handle$ close #w end end sub sub display #w.gb1 "cls" k =1 [here] entry$ =word$( Stack$, k, " ") if entry$ <>"EOS" then #w.gb1 "place 10 "; k *24 +5 #w.gb1 "\"; entry$ k =k +1 end if if entry$ <>"EOS" then goto [here] end sub
With a queue, the first in is also first out. I entered in this order, "12", "green", "bottles", etc. I have just popped off the first entry ( "12"), which therefore is back in the text box. Again however the queue is allowed to expand as far as your computer memory allows....
' FIFO- First In, First Out queue nomainwin cr$ =chr$( 13) WindowWidth = 550 WindowHeight = 690 UpperLeftX = 50 UpperLeftY = 50 BackgroundColor$ = "lightgray" graphicbox #w.gb1, 210, 110, 120, 520 textbox #w.tb1, 210, 40, 120, 30 button #w.b1, "Push", [push], LR, 370, 590 button #w.b1, "Pop ", [pop], LR, 170, 590 statictext #w.st1, "", 30, 120, 150, 150 statictext #w.st2, "", 350, 120, 150, 150 global Stack$, k Stack$ ="" ' will hold space-separated contents of stack. open "Queue" for window as #w #w "trapclose quit" '#w "fill lightgray" #w.gb1 "down" #w.gb1 " font arial 16" #w.tb1 "!font arial 16" #w.tb1 Stack$ #w.st1 "Type in the textbox and click" +cr$ +" 'Push'" +cr$ +" to put an entry on the stack top, pushing everything else down." #w.st2 "Click" +cr$ +" 'Pop'" +cr$ +" to pull an entry off stack bottom, making stack shorter." wait [push] #w.tb1 "!contents? inp$" ' push new value if inp$ <>"" then Stack$ =inp$ +" " +Stack$ call display #w.tb1 "" #w.tb1 "!setfocus" end if scan wait '____________________________________________________ [pop] ' take bottom term off stack entries =0 lenStack =len( Stack$) for i =1 to lenStack if mid$( Stack$, i, 1) =" " then entries =entries +1: lastEntry =i next i trm$ =word$( Stack$, entries, " ") lenTrm =len( trm$) if trm$ ="" then #w.tb1 "Empty!" else #w.tb1 trm$ Stack$ =left$( Stack$, lenStack -lenTrm -1) call display scan wait ' ____________________________________________________________ sub quit handle$ close #w end end sub sub display #w.gb1 "cls" k =1 [here] entry$ =word$( Stack$, k, " ") #w.gb1 "place 10 "; k *24 +5 #w.gb1 "\"; entry$ k =k +1 if entry$ <>"" then goto [here] end sub