Data Structure - Queue - OOP
Posted: Wed Jun 09, 2021 9:08 pm
Before I start, I want to clarify something : YES A QUEUE DATA STRUCTURE CAN BE DONE WITH STANDARD PB LINKED LIST.
There a prototype of a Queue data structure implementation. See the source code for the YouTube link about where the inspiration came from.
Best regards
StarBootics
There a prototype of a Queue data structure implementation. See the source code for the YouTube link about where the inspiration came from.
Best regards
StarBootics
Code: Select all
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Project name : Data Structure - Queue
; File Name : Queue - OOP.pb
; File version: 1.0.0
; Programming : Prototype
; Programmed by : StarBootics
; Date : June 9th, 2021
; Last Update : June 9th, 2021
; PureBasic code : V5.73 LTS
; Platform : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Based on the code presented by the YouTube channel
;
; https://www.youtube.com/channel/UC8butISFwT-Wl7EV0hUK0BQ
; Video link : https://www.youtube.com/watch?v=B31LgI4Y4DQ
; Video name : Data Structures - Full Course Using C And C++
;
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
DeclareModule Queue
Interface Queue
Enqueue(Value.l)
Dequeue()
Front.l()
IsEmpty.b()
Free()
EndInterface
Declare.i New()
EndDeclareModule
Module Queue
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Structures declaration <<<<<
Structure Node
Value.l
*Link.Node
EndStructure
Structure Private_Members
VirtualTable.i
*Front.Node
*Rear.Node
EndStructure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The Enqueue operator <<<<<
Procedure Enqueue(*This.Private_Members, Value.l)
*Temp.Node = AllocateStructure(Node)
*Temp\Value = Value
*Temp\Link = #Null
If *This\Front = #Null And *This\Rear = #Null
*This\Front = *Temp
*This\Rear = *Temp
ProcedureReturn 0
EndIf
*This\Rear\Link = *Temp
*This\Rear = *Temp
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The Dequeue operator <<<<<
Procedure Dequeue(*This.Private_Members)
*Temp.Node = *This\Front
If *This\Front = #Null
; MessageRequester("Queue Error", "The Queue is already Empty !")
ProcedureReturn 0
EndIf
If *This\Front = *This\Rear
*This\Front = #Null
*This\Rear = #Null
Else
*This\Front = *This\Front\Link
EndIf
FreeStructure(*Temp)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The Front operator <<<<<
Procedure.l Front(*This.Private_Members)
If *This\Front <> #Null
ProcedureReturn *This\Front\Value
Else
MessageRequester("Queue Error", "The Queue is Empty !")
EndIf
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The IsEmpty operator <<<<<
Procedure.b IsEmpty(*This.Private_Members)
If *This\Front = #Null
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The Destructor <<<<<
Procedure Free(*This.Private_Members)
While IsEmpty(*This) <> #True
Dequeue(*This)
Wend
FreeStructure(*This)
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The Constructor <<<<<
Procedure.i New()
*This.Private_Members = AllocateStructure(Private_Members)
*This\VirtualTable = ?START_METHODS
*This\Front = #Null
*This\Rear = #Null
ProcedureReturn *This
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< The VirtualTable entries <<<<<
DataSection
START_METHODS:
Data.i @Enqueue()
Data.i @Dequeue()
Data.i @Front()
Data.i @IsEmpty()
Data.i @Free()
END_METHODS:
EndDataSection
EndModule
CompilerIf #PB_Compiler_IsMainFile
MyQueue.Queue::Queue = Queue::New()
MyQueue\Enqueue(25)
MyQueue\Enqueue(35)
MyQueue\Enqueue(15)
MyQueue\Enqueue(45)
While MyQueue\IsEmpty() <> #True
Debug MyQueue\Front()
MyQueue\Dequeue()
Wend
MyQueue\Free()
CompilerEndIf
; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<