מחסנית ותור Stacks and Queues
מחסנית Stack
מחסנית - Stack ADT סוג של מערך מוגבל שימוש בLIFO מהיר מאוד ותופס מעט זיכרון שימוש בLIFO LIFO (Last In, First Out) lists. אפשר להוסיף רק בסוף הרשימה PUSH אפשר להוריד רק מסוף הרשימה POP (ADT – Abstract Data Type)
הפעולות הבסיסיות: השימוש של STACK הוא LIST עם מגבלות אפשר להוסיף רק לראש הרשימה PUSH סוג של INSERT POP סוג של REMOVE PEEK דרך לראות את הערך בראש הרשימה – הדרך היחידה לראות ערכים בלי להוריד אותם!
Push and Pop Primary operations: Push and Pop Push Pop Add an element to the top of the stack Pop Remove the element at the top of the stack empty stack push an element push another pop top B top top A A A top
דוגמא של POP Module Module1 Sub Main() Dim test As New Stack() Dim i As Integer For i = 1 To 5 test.Push(i) Next Console.WriteLine(test.Count) For i = 1 To test.Count Dim num As Integer = test.Pop() Console.WriteLine(num) End Sub End Module
דוגמא של PEEK Module Module1 Sub Main() Dim test As New Stack() Dim i As Integer For i = 1 To 5 test.Push(i) Next Console.WriteLine(test.Count) For i = 1 To test.Count Dim num As Integer = test.Peek() Console.WriteLine(num) End Sub End Module
תור Queue
Queue ADT סוג אחר של מערך מוגבל שימוש בFIFO מהיר מאוד, ולוקח מעט זיכרון שימוש בFIFO FIFO (First In, First Out) lists. אפשר להוסיף רק בסוף הרשימה Enqueue אפשר להוריד רק מהתחלת הרשימה Dequeue
דוגמא Module Module1 Sub Main() Dim queue As New Queue Dim i As Integer For i = 1 To 5 queue.Enqueue(i) Next For i = 1 To queue.Count Console.WriteLine(queue.Dequeue()) End Sub End Module
תרגיל כיתה אני מעונין לבנות מערכת לטפל בתהליך יצירת הדוחות בתוך משרד נבנה STRUCT פשוט לדוח נסמלץ תהליכי עבודה FIFO וLIFO נבנה פונקציות להדפיס נתונים ולחפש נתונים שימו לב: יש שינויים טכניים ולוגיים בין STACK וQUEUE (כמו שנראה)...
הSTRUCT Structure Report Dim code As Integer ' date type could be used instead... Dim Topic As String Dim Approval As Boolean Dim Content As String End Structure
הMAIN Sub Main() Dim ListQ As New Queue() Dim ListS As New Stack() Dim temp As Report For i = 0 To 5 temp.code = i temp.Topic = "Doch" + Convert.ToString(i) temp.Approval = False temp.Content = "blah" ListQ.Enqueue(temp) ListS.Push(temp) Next PrintStack(ListS) Console.WriteLine("And now...") Console.WriteLine("And the Queue...") PrintQueue(ListQ) Console.WriteLine("I found 0 in pos " & FindStack(ListS, 0)) Console.WriteLine("I found 0 in pos " & FindQueue(ListQ, 0)) End Sub
הPrintStack וPrintQueue Sub PrintStack(ByVal a As Stack) Dim extra As New Stack Dim times As Integer = a.Count Dim temp As New Report For i = 1 To times temp = a.Pop() ' why is a.Peek() a mistake? Console.WriteLine("The contents are {0} and {1} and {2}", temp.code, temp.Topic, temp.Content) extra.Push(temp) Next ' What happens without this??? temp = extra.Pop() a.Push(temp) End Sub Sub PrintQueue(ByVal a As Queue) Dim extra As New Queue Dim times As Integer = a.Count Dim temp As New Report For i = 1 To times temp = a.Dequeue() Console.WriteLine("The contents are {0} and {1} and {2}", temp.code, temp.Topic, temp.Content) extra.Enqueue(temp) Next ' What happens without this??? temp = extra.Dequeue() a.Enqueue(temp) End Sub
הצעה עבור FindStack וFindQueue Function FindStack(ByVal a As Stack, ByVal key As Integer) As Integer Dim extra As New Stack Dim times As Integer = a.Count Dim temp As New Report Dim count As Integer = 0 For i = 1 To times temp = a.Pop() count += 1 If temp.code = key Then Return count End If extra.Push(temp) Next temp = extra.Pop() a.Push(temp) Return -1 End Function Function FindQueue(ByVal a As Queue, ByVal key As Integer) As Integer Dim extra As New Queue Dim times As Integer = a.Count Dim temp As New Report Dim count As Integer = 0 For i = 1 To times temp = a.Dequeue() count += 1 If temp.code = key Then Return count End If extra.Enqueue(temp) Next temp = extra.Dequeue() a.Enqueue(temp) Return -1 End Function מה קורה אם מצאנו, ואח"כ נחפש שוב?
פתרון אפשרי עבור FindStack וFindQueue Function FindStack(ByVal a As Stack, ByVal key As Integer) As Integer Dim extra As New Stack Dim times As Integer = a.Count Dim temp As New Report Dim count As Integer = 0 For i = 1 To times temp = a.Pop() extra.Push(temp) count += 1 If temp.code = key Then For j = 1 To count temp = extra.Pop() a.Push(temp) Next Return (count) End If Return -1 End Function Function FindQueue(ByVal a As Queue, ByVal key As Integer) As Integer Dim extra As New Queue Dim times As Integer = a.Count Dim temp As New Report Dim count As Integer = 0 For i = 1 To times temp = a.Dequeue() extra.Enqueue(temp) count += 1 If temp.code = key Then For j = i + 1 To times Next For j = 1 To times temp = extra.Dequeue() a.Enqueue(temp) Return (count) End If Return -1 End Function
להמציא את הגלגל מחדש
להמציא מחדש את הגלגל יצירת מחסנית (עם פונקציות) להמציא מחדש את הגלגל יצירת מחסנית (עם פונקציות) Module Module1 Function Count(ByVal list As ArrayList) As Integer Return list.Count() End Function Sub Push(ByVal val As Object, ByRef list As ArrayList) list.Add(val) End Sub Function Pop(ByVal list As ArrayList) As Object Dim obj As Object = list.Item(list.Count - 1) list.RemoveAt(list.Count - 1) Return obj Function Peek(ByVal list As ArrayList) As Object Return list.Item(list.Count - 1) המשך....
להמציא מחדש את הגלגל - מחסנית, המשך Sub Main() Dim test As New ArrayList() Dim i As Integer For i = 0 To 4 Push(i, test) Next Console.WriteLine(Count(test)) For i = 0 To test.Count - 1 Dim num As Integer = Pop(test) Console.WriteLine(num) End Sub End Module
תרגיל: איך בונים QUEUE (עם פונקציות)? Function Count(ByVal list As ArrayList) As Integer Return List.Count() End Function Sub Enqueue(ByVal val As Object, ByRef list As ArrayList) ??? End Sub Function Dequeue(ByVal list As ArrayList) As Object Function Peek(ByVal list As ArrayList) As Object Return list.Item(0)
תרגיל: לחשב מחיר על בסיס LIFO וגם FIFO QUEUE לFIFO STACK לLIFO יש לבנות מבנה עם מחיר וכמות יש להכניס ערכים לתוך STACK וQUEUE Push, Enqueue יש לחשב את המחיר לפי הפונקציות: DEQUEUE (לQUEUE) POP (לSTACK)
איך מתחילים?? Structure Stock Dim Amount As Integer Dim Price As Decimal End Structure Module Module1 Sub Main() Dim List1 As New Queue() Dim List2 As New Stack() Dim temp As Stock temp.Amount = 10 temp.Price = 5.5 List1.Enqueue(temp) List2.Push(temp) temp.Amount = 50 temp.Price = 8.5 temp = List1.Peek() Console.WriteLine("What's the cost? " & temp.Price) temp = List2.Peek() End Sub End Module
איך מתחילים?? אפשרות נוספת Structure Stock Dim Price As Decimal End Structure Module Module1 Sub Main() Dim List1 As New Queue() Dim List2 As New Stack() Dim temp As Stock temp.Price = 5.5 List1.Enqueue(temp) List2.Push(temp) temp.Price = 8.5 temp = List1.Peek() Console.WriteLine("What's the cost? " & temp.Price) temp = List2.Peek() End Sub End Module