Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22

Как добавлять и удалять элементы из очереди?

16.06.2017, 11:32. Показов 1183. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не нашел методы Push и Pop для очереди.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.06.2017, 11:32
Ответы с готовыми решениями:

Добавлять/удалять элементы с разных концов очереди
Как создать очередь в си и работать с ней? Необходимо добавлять/удалять элементы с разных концов

Как правильно добавлять и удалять элементы в вектор и из него
Всем доброго времени суток. Прошу объяснить как правильно добавлять и удалять элементы в вектор и из него... Использую его для хранения...

Как во время работы программы добавлять и удалять элементы, pictureBox в том числе?
Как во время работы программы нажимая на button добавлять в форму группы элементов, чтобы новая группа появлялась ниже. Ну это полная...

11
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,059
16.06.2017, 12:25
Для очереди используют Store и Return…

Добавлено через 6 минут
А про то, как это делать:
нужно сначала узнать — как вы их строите?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33195 / 21491 / 8233
Регистрация: 22.10.2011
Сообщений: 36,877
Записей в блоге: 12
16.06.2017, 13:03
Лучший ответ Сообщение было отмечено Volobuev Ilya как решение

Решение

Для очереди используют Enqueue/Dequeue (по крайней мере для класса Queue<> из .NET-а)
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
16.06.2017, 13:11  [ТС]
Я использую Queue. Спасибо.

Добавлено через 7 минут
Как проверить пуста ли очередь?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33195 / 21491 / 8233
Регистрация: 22.10.2011
Сообщений: 36,877
Записей в блоге: 12
16.06.2017, 13:12
Лучший ответ Сообщение было отмечено Volobuev Ilya как решение

Решение

Pascal
1
2
if q.Count = 0 then // очередь пуста
else // не пуста
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
16.06.2017, 13:28  [ТС]
Enqueue - добавить; Dequeue - удалить?

Добавлено через 3 минуты
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
uses crt, Graph, GraphABC;
const
  n = 7;
 
var
  a: array of Graph.GraphVertex;
  q: Queue<Graph.GraphVertex>;
  CurrVert: Graph.GraphVertex;
  LinkedVerts:array of Graph.GraphVertex;
  
///Получить вершину по имени.
function Get(name: string):= Graph.GraphVertex.GetVertex(a, name);
 
begin
  SetLength(a, n);
  for var i := 0 to n - 1 do a[i] := new GraphVertex(0, 0);
  
  a[0].Name := 'A';a[1].Name := 'B';a[2].Name := 'C';
  a[3].Name := 'D';a[4].Name := 'E';a[5].Name := 'F';
  a[6].Name := 'G';
  
  Get('A').Position.Xposition := 100;Get('A').Position.Yposition := 100;
  Get('B').Position.Xposition := 200;Get('B').Position.Yposition := 100;
  Get('C').Position.Xposition := 100;Get('C').Position.Yposition := 200;
  Get('D').Position.Xposition := 200;Get('D').Position.Yposition := 200;
  Get('F').Position.Xposition := 300;Get('F').Position.Yposition := 100;
  Get('E').Position.Xposition := 300;Get('E').Position.Yposition := 300;
  Get('G').Position.Xposition := 400;Get('G').Position.Yposition := 300;
  
  Get('A').AddVertex(Get('B'));Get('A').AddVertex(Get('C'));
  Get('B').AddVertex(Get('F'));Get('B').AddVertex(Get('D'));
  Get('C').AddVertex(Get('D'));
  Get('D').AddVertex(Get('E'));
  Get('F').AddVertex(Get('E'));
  Get('E').AddVertex(Get('G'));
  
  for var i := 0 to n - 1 do
  begin
    a[i].DrawSelf;a[i].DrawLines;
  end;
  
  q.Enqueue(Get('A')); // Проверил, точка с именем A существует. Но почему выдает ошибку?
  
  while q.Count <> 0 do
  begin
    CurrVert := q.Dequeue;
    CurrVert.IsMarked:=true;
    LinkedVerts:=CurrVert.GetMarkedVertexes(false);
    for var i:=0 to Length(LinkedVerts) do q.Enqueue(LinkedVerts[i]);
  end;
end.
Добавлено через 32 секунды
Пытаюсь реализовать алгоритм поиска в ширину в графе через очередь.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33195 / 21491 / 8233
Регистрация: 22.10.2011
Сообщений: 36,877
Записей в блоге: 12
16.06.2017, 13:33
Лучший ответ Сообщение было отмечено Volobuev Ilya как решение

Решение

Очередь надо создать:
Pascal
1
2
3
var
  a: array of Graph.GraphVertex;
  q: Queue<Graph.GraphVertex> := new Queue<Graph.GraphVertex>; // <---
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
16.06.2017, 14:18  [ТС]
Ой, точно

Добавлено через 44 минуты
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
uses Graph, GraphABC;
const
  n = 7;
 
var
  a: array of Graph.GraphVertex;
  q: Queue<Graph.GraphVertex>;
  CurrVert: Graph.GraphVertex;
  LinkedVerts: array of Graph.GraphVertex;
  L: integer;
 
///Получить вершину по имени.
function Get(name: string):= Graph.GraphVertex.GetVertex(a, name);
 
begin
  SetLength(a, n);
  for var i := 0 to n - 1 do a[i] := new GraphVertex(0, 0);
  
  a[0].Name := 'A';a[1].Name := 'B';a[2].Name := 'C';
  a[3].Name := 'D';a[4].Name := 'E';a[5].Name := 'F';
  a[6].Name := 'G';
  
  Get('A').Position.Xposition := 100;Get('A').Position.Yposition := 100;
  Get('B').Position.Xposition := 200;Get('B').Position.Yposition := 100;
  Get('C').Position.Xposition := 100;Get('C').Position.Yposition := 200;
  Get('D').Position.Xposition := 200;Get('D').Position.Yposition := 200;
  Get('F').Position.Xposition := 300;Get('F').Position.Yposition := 100;
  Get('E').Position.Xposition := 300;Get('E').Position.Yposition := 300;
  Get('G').Position.Xposition := 400;Get('G').Position.Yposition := 300;
  
  Get('A').AddVertex(Get('B'));Get('A').AddVertex(Get('C'));
  Get('B').AddVertex(Get('F'));Get('B').AddVertex(Get('D'));
  Get('C').AddVertex(Get('D'));
  Get('D').AddVertex(Get('E'));
  Get('F').AddVertex(Get('E'));
  Get('E').AddVertex(Get('G'));
  
  Get('A').Level := 0;
  
  q := new Queue<GraphVertex>();
  q.Enqueue(Get('A'));
  
  while q.Count <> 0 do
  begin
    CurrVert := q.Dequeue;
    CurrVert.IsMarked := true;
    LinkedVerts := CurrVert.GetMarkedVertexes(false);
    for var i := 0 to Length(LinkedVerts) - 1 do
    begin
      LinkedVerts[i].Level := CurrVert.Level + 1;
      q.Enqueue(LinkedVerts[i]);
    end;
    L := CurrVert.Level;
  end;
  Write(L);
  
  for var i := 0 to n - 1 do
  begin
    a[i].DrawSelf;a[i].DrawLines;
  end;
end.
Готовый код.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33195 / 21491 / 8233
Регистрация: 22.10.2011
Сообщений: 36,877
Записей в блоге: 12
16.06.2017, 14:36
В чем смысл выкладывать программу, если для нее нужен сторонний модуль, который не выкладывается?
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
16.06.2017, 15:01  [ТС]
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
unit Graph;
 
uses GraphABC;
 
const
  Radius = 5;
 
type
  ///Location object
  Location = class
  private 
    dx, dy: integer;
    
    function XpositionRead()  := dx;
    
    function YpositionRead()  := dy;
    
    procedure XpositionWrite(v: integer);
    begin
      dx := v;
    end;
    
    procedure YpositionWrite(v: integer);
    begin
      dy := v;
    end;
  
  public 
    constructor(x, y: integer);
    begin
      dx := x;dy := y;
    end;
    
    ///X
    property Xposition: integer read XpositionRead write XpositionWrite;
    ///Y
    property Yposition: integer read YpositionRead write YpositionWrite;
  end;
  
  
  ///Graph's vertex
  GraphVertex = class
  private 
    p: Location;
    n: string;
    marked: boolean;
    Lev: integer;
    function PositionRead()  := p;
    
    procedure PositionWrite(v: Location);
    begin
      p := v;
    end;
    
    function NameRead()  := n;
    
    procedure NameWrite(v: string);
    begin
      n := v;
    end;
    
    function IsMarkedRead()  := marked;
    
    procedure IsMarkedWrite(v: boolean);
    begin
      marked := v;
    end;
    
    function LevelRead()  := Lev;
    
    procedure LevelWrite(v: integer);
    begin
      Lev := v;
    end;
  
  public 
    ///List of linked vertexes
    Vertexes: array of GraphVertex;
    
    constructor(x, y: integer);
    begin
      p := new Location(x, y); marked:=false;
    end;
    
    ///Position of the vertex
    property Position: Location read PositionRead write PositionWrite;
    ///Vertex'es name
    property Name: string read NameRead write NameWrite;
    ///The vertex is marked
    property IsMarked: boolean read IsMarkedRead write IsMarkedWrite;
    ///Level value (for DFS and other seaching algorithms)
    property Level: integer read LevelRead write LevelWrite;
    
    ///Draw free vertex
    procedure Draw(v: GraphVertex);
    begin
      SetPenColor(clBlack);
      SetPenWidth(1);
      SetBrushColor(clRed);
      FillCircle(v.Position.Xposition, v.Position.Yposition, Radius);
      DrawCircle(v.Position.Xposition, v.Position.Yposition, Radius);
      SetBrushColor(ARGB(0, 0, 0, 0));
      TextOut(v.Position.Xposition + 10, v.Position.Yposition + 10, v.Name+' L:'+IntToStr(Lev));
    end;
    
    ///Draw all vertexes, those are liked to the current vertex.
    procedure DrawLinked();
    begin
      for var i := 0 to Length(Vertexes) - 1 do Draw(Vertexes[i]);
    end;
    
    ///Draw vertex
    procedure DrawSelf() := Draw(self);
    
    ///Draw all lines those connect the current vertex to the others
    procedure DrawLines();
    begin
      Draw(self);
      for var i := 0 to Length(Vertexes) - 1 do
        if Vertexes[i] <> nil then
          Line(self.Position.Xposition, self.Position.Yposition, self.Vertexes[i].Position.Xposition, self.Vertexes[i].Position.Yposition);
    end;
    
    ///Add new vertex
    procedure AddVertex(v: GraphVertex);
    begin
      SetLength(Vertexes, Length(Vertexes) + 1);
      Vertexes[Length(Vertexes) - 1] := v;
    end;
    
    ///Add new vertex in any array
    class procedure AddVertex(var a: array of GraphVertex; v: GraphVertex);
    begin
      SetLength(a, Length(a) + 1);
      a[Length(a) - 1] := v;
    end;
    
    ///Replace the first vertex with the second one
    procedure ResetVertex(v, v2: GraphVertex);
    var
      l, i: integer;
    begin
      l := Length(Vertexes);
      i := 0;
      while (i < l) and (Vertexes[i] <> v) do Inc(i);
      Vertexes[i] := v2;
    end;
    
    ///Replace the first vertex with the second one in any array
    procedure ResetVertex(var a: array of GraphVertex; v, v2: GraphVertex);
    var
      l, i: integer;
    begin
      l := Length(a);
      i := 0;
      while (i < l) and (a[i] <> v) do Inc(i);
      a[i] := v2;
    end;
    
    ///Get vertex by it's id (name).
    class function GetVertex(a: array of GraphVertex; id: string): GraphVertex;
    var
      l, i: integer;
    begin
      l := Length(a);
      i := 0;
      while (i < l) and (a[i].Name <> id) do Inc(i);
      if i < l then GetVertex := a[i] else GetVertex := nil;
    end;
    
    ///Get all marked (not marked) vertexes from Vertexes.
    function GetMarkedVertexes(t: boolean): array of GraphVertex;
    var
      a: array of GraphVertex;
    begin
      for var i := 0 to Length(Vertexes) - 1 do
        if Vertexes[i].IsMarked = t then AddVertex(a, Vertexes[i]);
      GetMarkedVertexes := a;
    end;
  end;
end.
Код модуля.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33195 / 21491 / 8233
Регистрация: 22.10.2011
Сообщений: 36,877
Записей в блоге: 12
16.06.2017, 15:14
Так вот этот модуль можно переписать гораздо проще без использования этих самых динамических массивов (заменив их на List<>). Скажем, тогда ResetVertex будет выглядеть не так:
Pascal
1
2
3
4
5
6
7
8
9
10
    ///Replace the first vertex with the second one
    procedure ResetVertex(v, v2: GraphVertex);
    var
      l, i: integer;
    begin
      l := Length(Vertexes);
      i := 0;
      while (i < l) and (Vertexes[i] <> v) do Inc(i);
      Vertexes[i] := v2;
    end;
, а вот так:
Pascal
1
2
3
4
5
    ///Replace the first vertex with the second one
    procedure ResetVertex(v, v2: GraphVertex);
    begin
      Vertexes.Item[Vertexes.FindIndex(vx -> vx = v)] := v2;
    end;
, а AddVertex - вот так:
Pascal
1
2
3
4
5
    ///Add new vertex
    procedure AddVertex(v: GraphVertex);
    begin
      Vertexes.Add(v);
    end;
, код становится гораздо более компактным и эффективным.
1
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
16.06.2017, 15:18  [ТС]
Спасибо! Пойду переписывать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.06.2017, 15:18
Помогаю со студенческими работами здесь

Описать класс «множество», позволяющий добавлять и удалять элементы
Всем доброго времени суток, нужна небольшая помощь, void set(int fir, int sec, int thir,int fir1,int sec1,int thir1); Нужно сделать из 19...

Создать файл, в который можно добавлять, редактировать и удалять элементы структуры
По заданию нужно создать файл, в который можно добавлять, редактировать и удалять элементы структуры. Пока нахожусь на стадии: как добавить...

Как удалять и добавлять вертексы в шейдер?
Всё копаюсь с морфингом. Есть необходмость в определённые момент добавлять некоторые НОВЫЕ грани в шейдер и удалять из - него другие. Так...

Как в datagrid добавлять и удалять колонки
Как можно сделать динамическое добавление и удаление колонок в datagrid? В devexpress есть реализация, добавления, удаления колонок, а в...

Как динамически добавлять/удалять страницы ViewPager
Добрый день Всем! как можно добавлять и удалять страницы во ViewPager? пытаюсь делать так: MainActiv: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru