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

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

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

Author24 — интернет-сервис помощи студентам
Не нашел методы Push и Pop для очереди.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.06.2017, 11:32
Ответы с готовыми решениями:

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

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

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

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

11
5079 / 2651 / 2349
Регистрация: 10.12.2014
Сообщений: 10,028
16.06.2017, 12:25 2
Для очереди используют Store и Return…

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

Решение

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

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

Решение

Pascal
1
2
if q.Count = 0 then // очередь пуста
else // не пуста
0
Alvin Seville
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
16.06.2017, 13:28  [ТС] 6
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
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
16.06.2017, 13:33 7
Лучший ответ Сообщение было отмечено 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
Записей в блоге: 9
16.06.2017, 14:18  [ТС] 8
Ой, точно

Добавлено через 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
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
16.06.2017, 14:36 9
В чем смысл выкладывать программу, если для нее нужен сторонний модуль, который не выкладывается?
0
Alvin Seville
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
16.06.2017, 15:01  [ТС] 10
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
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
16.06.2017, 15:14 11
Так вот этот модуль можно переписать гораздо проще без использования этих самых динамических массивов (заменив их на 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
Записей в блоге: 9
16.06.2017, 15:18  [ТС] 12
Спасибо! Пойду переписывать.
0
16.06.2017, 15:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.06.2017, 15:18
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru