Приоритетно-подобная структура данных в VBA, реализованная с помощью коллекции

Я хочу реализовать в VBA структуру данных, подобную priorityQueue, которая позволяет мне вставлять значения и извлекать (тем временем удалять) максимальное значение каждый раз.

Например: запустите следующий код:

Sub Main_PQ()  
Dim Q As PriorityQueue     'Define Q As PriorityQueue
Set Q = New PriorityQueue
Q.Insert 3.1
Q.Insert 5.3
Q.Insert 4.2
Q.Insert 1
Debug.Print Q.ExtractMax
Debug.Print Q.ExtractMax
Debug.Print Q.ExtractMax
Debug.Print Q.ExtractMax
End Sub

Я должен получить

5.3
4.2
3.1
1

Вместо этого я получил

5.3 
4.2 
1 
1 

Каждый раз что-то не так с меньшим индексом lile 0,1,2.

Вот мой код, я не получил правильный ответ, но довольно близко. Пожалуйста, помогите мне проверить это.

Private Queue As New Collection
Private M_counter As Integer      'Use M_counter to store which one to delete each time.

Function Insert(Key As Double)    'Pretty simple insertion
    Queue.Add (Key)
End Function           

Function ExtractMax() As Double     
    If (Queue.Count = 2) Then                        'I am sure this is not useful. I 
                                                     'tried to fix my bug with the  
                                                     'seperation of different operations.
        If (Queue.Item(2) > Queue.Item(1)) Then
            ExtractMax = Queue.Item(2)
            Queue.Remove (2)
        ElseIf Queue.Item(2) < Queue.Item(1) Then
            ExtractMax = Queue.Item(1)
            Queue.Remove (1)
        End If
    End If         

   If Queue.Count = 1 Then
        ExtractMax = Queue.Item(1)
   Else
        ExtractMax = FindMax(Queue.Count)     'Refers to the bottom method 
        Queue.Remove (M_counter)
        Index = Queue.Count
   End If
End Function

Function FindMax(Index As Integer) As Double
    Dim Temp As Double      'Use Temp to store the max value
    Temp = Queue.Item(1)
    For counter = 1 To Index
        If Queue.Item(counter) > Temp Then
            Temp = Queue.Item(counter)
            M_counter = counter
        End If
    Next counter
    FindMax = Temp
End Function

1 ответ

Я думаю, что вы слишком усложняете это:

Option Explicit

Private Queue As New Collection

Function Insert(Key As Double)
    Queue.Add (Key)
End Function

Function ExtractMax() As Double
    Dim x As Long, dbl, M_counter As Long

    ExtractMax = 0: M_counter = 1: x = 1

    For Each dbl In Queue
        If dbl > ExtractMax Then
            ExtractMax = dbl
            M_counter = x
        End If
        x = x + 1
    Next dbl

    Queue.Remove M_counter

End Function
Другие вопросы по тегам