230 likes | 488 Views
מחסנית ותור. Stacks and Queues. מחסנית Stack. מחסנית - Stack ADT. סוג של מערך מוגבל מהיר מאוד ותופס מעט זיכרון שימוש ב LIFO LIFO (Last In, First Out) lists. אפשר להוסיף רק בסוף הרשימה PUSH אפשר להוריד רק מסוף הרשימה POP (ADT – Abstract Data Type). הפעולות הבסיסיות:.
E N D
מחסנית ותור Stacks and Queues
מחסנית - Stack ADT • סוג של מערך מוגבל • מהיר מאוד ותופס מעט זיכרון • שימוש בLIFO • LIFO (Last In, First Out) lists. • אפשר להוסיף רק בסוף הרשימה • PUSH • אפשר להוריד רק מסוף הרשימה • POP • (ADT – Abstract Data Type)
הפעולות הבסיסיות: • השימוש של STACK הוא LIST עם מגבלות • אפשר להוסיף רק לראש הרשימה • PUSH סוג של INSERT • POP סוג של REMOVE • PEEK דרך לראות את הערך בראש הרשימה – הדרך היחידה לראות ערכים בלי להוריד אותם!
A A B A top top top Push and Pop • Primary operations: Push and Pop • Push • 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
דוגמא של POP ModuleModule1 Sub Main() Dim test AsNewStack() DimiAsInteger Fori = 1 To 5 test.Push(i) Next Console.WriteLine(test.Count) Fori = 1 Totest.Count Dim num AsInteger = test.Pop() Console.WriteLine(num) Next EndSub EndModule
דוגמא של PEEK ModuleModule1 Sub Main() Dim test AsNewStack() DimiAsInteger Fori = 1 To 5 test.Push(i) Next Console.WriteLine(test.Count) Fori = 1 Totest.Count Dim num AsInteger = test.Peek() Console.WriteLine(num) Next EndSub EndModule
Queue ADT • סוג אחר של מערך מוגבל • מהיר מאוד, ולוקח מעט זיכרון • שימוש בFIFO • FIFO (First In, First Out) lists. • אפשר להוסיף רק בסוף הרשימה • Enqueue • אפשר להוריד רק מהתחלת הרשימה • Dequeue
דוגמא ModuleModule1 Sub Main() Dim queue AsNewQueue DimiAsInteger Fori = 1 To 5 queue.Enqueue(i) Next Fori = 1 Toqueue.Count Console.WriteLine(queue.Dequeue()) Next EndSub EndModule
תרגיל כיתה • אני מעונין לבנות מערכת לטפל בתהליך יצירת הדוחות בתוך משרד • נבנה STRUCT פשוט לדוח • נסמלץ תהליכי עבודה FIFO וLIFO • נבנה פונקציות להדפיס נתונים ולחפש נתונים • שימו לב: יש שינויים טכניים ולוגיים בין STACK וQUEUE (כמו שנראה)...
הSTRUCT StructureReport Dim code AsInteger' date type could be used instead... Dim Topic AsString Dim Approval AsBoolean Dim Content AsString EndStructure
הMAIN Sub Main() DimListQAsNewQueue() DimListSAsNewStack() Dim temp AsReport Fori = 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...") PrintStack(ListS) Console.WriteLine("And the Queue...") PrintQueue(ListQ) Console.WriteLine("And now...") PrintQueue(ListQ) Console.WriteLine("I found 0 in pos " & FindStack(ListS, 0)) Console.WriteLine("I found 0 in pos " & FindQueue(ListQ, 0)) EndSub
הPrintStack וPrintQueue 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 For i = 1 To times ' What happens without this??? temp = extra.Dequeue() a.Enqueue(temp) Next End Sub 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 For i = 1 To times ' What happens without this??? temp = extra.Pop() a.Push(temp) Next End Sub
הצעה עבור FindStack וFindQueue FunctionFindQueue(ByVal a AsQueue, ByVal key AsInteger) AsInteger Dim extra AsNewQueue Dim times AsInteger = a.Count Dim temp AsNewReport Dim count AsInteger = 0 Fori = 1 To times temp = a.Dequeue() count += 1 Iftemp.code = key Then Return count EndIf extra.Enqueue(temp) Next Fori = 1 To times temp = extra.Dequeue() a.Enqueue(temp) Next Return -1 EndFunction Function FindStack(ByVala As Stack, ByValkey 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 Fori = 1 Totimes temp = a.Pop() count += 1 If temp.code = key Then Return count End If extra.Push(temp) Next Fori = 1 To times temp = extra.Pop() a.Push(temp) Next Return -1 End Function מה קורה אם מצאנו, ואח"כ נחפש שוב?
פתרון אפשרי עבור FindStack וFindQueue FunctionFindQueue(ByVal a AsQueue, ByVal key AsInteger) AsInteger Dimextra AsNewQueue Dimtimes AsInteger = a.Count Dimtemp AsNewReport Dimcount AsInteger = 0 Fori = 1 To times temp = a.Dequeue() extra.Enqueue(temp) count += 1 Iftemp.code = key Then For j = i + 1 Totimes temp = a.Dequeue() extra.Enqueue(temp) Next For j = 1 To times temp = extra.Dequeue() a.Enqueue(temp) Next Return (count) EndIf Next Fori = 1 Totimes temp = extra.Dequeue() a.Enqueue(temp) Next Return -1 EndFunction FunctionFindStack(ByVal a AsStack, ByVal key AsInteger) AsInteger Dimextra AsNewStack Dimtimes AsInteger = a.Count Dimtemp AsNewReport Dimcount AsInteger = 0 Fori = 1 To times temp = a.Pop() extra.Push(temp) count += 1 Iftemp.code = key Then Forj = 1 To count temp = extra.Pop() a.Push(temp) Next Return(count) EndIf Next Fori = 1 Totimes temp = extra.Pop() a.Push(temp) Next Return -1 EndFunction
להמציא מחדש את הגלגליצירת מחסנית(עם פונקציות) ModuleModule1 Function Count(ByVal list AsArrayList) AsInteger Returnlist.Count() EndFunction Sub Push(ByValvalAsObject, ByRef list AsArrayList) list.Add(val) EndSub Function Pop(ByVal list AsArrayList) AsObject Dim obj AsObject = list.Item(list.Count - 1) list.RemoveAt(list.Count - 1) Returnobj EndFunction Function Peek(ByVal list AsArrayList) AsObject Returnlist.Item(list.Count - 1) EndFunction המשך....
להמציא מחדש את הגלגל - מחסנית, המשך Sub Main() Dim test AsNewArrayList() DimiAsInteger Fori = 0 To 4 Push(i, test) Next Console.WriteLine(Count(test)) Fori = 0 Totest.Count - 1 Dim num AsInteger = Pop(test) Console.WriteLine(num) Next EndSub EndModule
תרגיל: איך בונים QUEUE (עם פונקציות)? • Function Count(ByVal list AsArrayList) AsInteger • ReturnList.Count() • EndFunction • SubEnqueue(ByValvalAsObject, ByRef list AsArrayList) • ??? • EndSub • FunctionDequeue(ByVal list AsArrayList) AsObject • ??? • EndFunction • Function Peek(ByVal list AsArrayList) AsObject • Returnlist.Item(0) • EndFunction
תרגיל: לחשב מחיר על בסיס LIFO וגם FIFO • QUEUE לFIFO • STACK לLIFO • יש לבנות מבנה עם מחיר וכמות • יש להכניס ערכים לתוך STACK וQUEUE • Push, Enqueue • יש לחשב את המחיר לפי הפונקציות: • DEQUEUE (לQUEUE) • POP (לSTACK)
איך מתחילים?? StructureStock Dim Amount AsInteger Dim Price AsDecimal EndStructure ModuleModule1 Sub Main() Dim List1 AsNewQueue() Dim List2 AsNewStack() Dim temp AsStock temp.Amount = 10 temp.Price = 5.5 List1.Enqueue(temp) List2.Push(temp) temp.Amount = 50 temp.Price = 8.5 List1.Enqueue(temp) List2.Push(temp) temp = List1.Peek() Console.WriteLine("What's the cost? " & temp.Price) temp = List2.Peek() Console.WriteLine("What's the cost? " & temp.Price) EndSub EndModule
איך מתחילים?? אפשרות נוספת StructureStock Dim Price AsDecimal EndStructure ModuleModule1 Sub Main() Dim List1 AsNewQueue() Dim List2 AsNewStack() Dim temp AsStock temp.Price = 5.5 List1.Enqueue(temp) List2.Push(temp) temp.Price = 8.5 List1.Enqueue(temp) List2.Push(temp) temp = List1.Peek() Console.WriteLine("What's the cost? " & temp.Price) temp = List2.Peek() Console.WriteLine("What's the cost? " & temp.Price) EndSub EndModule