FreeBasic
Главная
Вход
Регистрация
Среда, 09.10.2024, 08:50Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Очередь из 10 элементов
haavДата: Четверг, 23.07.2015, 09:47 | Сообщение # 1
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Репутация: 49
Статус: Offline
Для одной программы понадобилось создать наподобие ограниченного буфера обмена.

Что в сущности было нужно:

1) Чтобы буфер обмена содержал не более 10 элементов
2) Чтобы новый новый добавляемый элемент всегда был последним
2) Чтобы когда буфер переполнялся, первый элемент удалялся

Думаю, что в данном случае самый подходящий алгоритм - это очереди.

Вот пример реализации:

Код
'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
' Очередь из 10 элементов
'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

' класс queue
Type queue
  v As Integer ' значение
  pNext As queue Ptr ' указатель на следующий элемент
  Declare Sub AddQueue( v As Integer) ' метод добавления
  Declare Sub DelQueue() ' метод полного удаления
  Declare Sub PrintQueue() ' вывод на консоль всех элементов
End Type

Dim Shared As queue Ptr pFirst, pEnd  ' указатели на начало и конец очереди
Dim Shared As Integer iIndex ' кол-во элементов в очереди

' метод добавления элемента в очередь
Sub queue.AddQueue( v As Integer)

  Dim pTemp As queue Ptr = New queue ' создаем новый элемент очереди
  pTemp->v = v ' присваиваем значение

  If iIndex<10 Then ' если очередь содержит меньше 10 элементов

   If iIndex = 0 Then ' если в очереди еще нет элементов
    pFirst = pTemp ' данный элемент становится первым в очереди
    pEnd = pTemp ' так же данный элемент является последним в очереди
    pEnd->pNext = 0 ' указатель на следующий элемент обнуляем
   Else
    pEnd->pNext = pTemp ' данный элемент ставим в очередь после последнего элемента
    pEnd = pTemp ' теперь этот элемент стал последним
    pTemp->pNext = 0 ' указатель на следующий элемент обнуляем
   EndIf

   iIndex+=1 ' увеличиваем счетчик элементов

  Else

   Dim As queue Ptr pDel = pFirst ' запоминаем первый указатель для удаления
   pFirst = pFirst->pNext ' теперь второй элемент станет первым в очереди
   Delete pDel : pDel = 0 ' удаляем запомненный элемент и обнуляем

   pEnd->pNext = pTemp ' данный элемент ставим в очередь после последнего элемента
   pEnd = pTemp ' теперь этот элемент стал последним
   pTemp->pNext = 0 ' указатель на следующий элемент обнуляем
  EndIf

End Sub

' метод удалениея всех элементов из очереди
Sub queue.DelQueue()

  ' временные указатели на элементы очереди,
  ' одному из них присваиваем первый элемент очереди
  Dim As queue Ptr pDel, pTemp =  pFirst

  While pTemp <> 0 ' пока указатель на элемент очереди существует

   pDel = pTemp ' присваиваем указатель на удаление
   pTemp = pTemp->pNext ' присваиваем указатель на следующий элемент
   Delete pDel ' удаляем элемент

  Wend

End Sub

' метод вывода на консоль всех элементов очереди
Sub queue.PrintQueue()
   
  ' временный указатель на элемент очереди,
  ' присваиваем ему указатель на первый элемент
  Dim As queue Ptr pTemp =  pFirst  
   
  While pTemp <> 0 ' пока указатель на элемент очереди существует

   Print pTemp->v & " "; ' выводим значение элемента очереди на консоль
   pTemp = pTemp->pNext ' присваиваем указатель на следующий элемент

  Wend  
  Print  
End Sub

'\\\\\\\\\\\\\\\\\\\\\\\\
' Тест работы класса
'\\\\\\\\\\\\\\\\\\\\\\\\

Dim pInitQueue As queue Ptr  = New queue ' инициализируем класс

' Цикл на 20 итераций (в очередь поступит 20 значений)
For i As Integer = 1 To 20  
  pInitQueue->AddQueue(i) ' добавляем элемент
  pInitQueue->PrintQueue() ' печатаем все элементы очереди
  Print ' пустая строка (разделитель)
  Print "Press any key!!!"
  sleep
Next

pInitQueue->DelQueue() ' удаляем все элементы
Delete pInitQueue ' удаляем указатель инициализации класса
Print "End program, press any key"
Sleep


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
  • Страница 1 из 1
  • 1
Поиск: