Форум программистов, компьютерный форум, киберфорум
Pascal ABC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 19.09.2015
Сообщений: 45

Сформировать стек, поместить в него компоненты очереди в порядке возрастания значений

29.12.2015, 00:48. Показов 1926. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
помогите, пожалуйста, с программой. нужно сформировать очередь (это я сделала), сформировать стек, поместить в него компоненты очереди в порядке возрастания значений. вот не понимаю как от макс значения к минимальному сделать, через массив? если через массив, то как тогда поместить в него значения из очереди?
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
uses crt;
type Ochered=record
             data:integer;
             next:^Ochered;   
             end;
  
  
{Процедура добавляющая элемент в очередь}
procedure AddElemOchered(var Oc1:^Ochered);
var cur:^Ochered;
    x: integer;
    c: char;
begin
new(oc1);
writeln('Введите целое число, для добавления в очередь');
readln(x);  
oc1^.data:=x;
oc1^.next:=nil;
writeln('Продолжать? Для выхода введите букву "N"');
readln(c);
if (c <> 'N') then begin cur:=oc1;
   repeat
     writeln('Введите целое число, для добавления в очередь');
     readln(x); 
     new(cur^.next);
     cur:=cur^.next;
     cur^.data:=x;
     cur^.next:=nil;
     writeln('Продолжать? Для выхода введите букву "N"');
     readln(c);
   until c='N';
end;
end;
 
 
{Процедура вывода очереди в прямом порядке}
procedure printOchered(Oc1:^Ochered);
var cur:^Ochered;
begin
Writeln('Ochered:');
cur:=oc1;
  repeat
  write(cur^.data,' ');
  cur:=cur^.next;
  until (cur^.next = nil);
  writeln(cur^.data);
end;
 
 
var  och:^Ochered;
begin
clrscr;
addElemOchered(och); 
printOchered(och);
readkey;
end.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.12.2015, 00:48
Ответы с готовыми решениями:

Задача со стеками. В первый стек поместить четные числа в порядке неубывания, во второй стек поместить нечетные
Даны четыре стека.Два первых стека пустые,а в двух других находятся натуральные числа.В первый пустой стек поместить четные числа в порядке...

Сформировать массив Y, поместив в него в порядке возрастания все различные числа, входящие в массив X
Ребята тут проблема, не знаю как дальше решить. 30. Дан массив целых чисел X(n). Сформировать массив Y (m), поместив в него в порядке...

Сформировать массив y(m) , поместив в него в порядке возрастания все различные числа, входящие в массив
Дан массив целых чисел x(n) . Сформировать массив y(m) , поместив в него в порядке возрастания все различные числа, входящие в массив ....

4
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8645 / 4480 / 1669
Регистрация: 01.02.2015
Сообщений: 13,888
Записей в блоге: 11
29.12.2015, 13:07
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Думаю, что придётся немного переделать программу. Цель - отделить интерфейс (взаимодействие с пользователем) от логики работы программы (занесение в очередь и извлечение из очереди). В итоге получатся подпрограммы Push (поместить) и Pop (извлечь), а AddElemOchered будет вызывать Push без манипуляций с указателями.

Может быть поступить так (почти как с массивами):
1. Вычислить длину очереди (может быть на этапе заполнения, может быть отдельной процедурой) - OcheredLen.
2. Взять из очереди первый элемент (TempMin:=Pop()).
3. Перебор оставшихся в очереди элементов (OcheredLen - 1) - может быть даже в цикле for. Перебор заключается в том, что извлекаем элемент из очереди (из её головы), сравниваем его с текущим минимальным и в очередь (в её хвост) отправляем неподходящий элемент, а подходящий становится текущим эталоном (минимальным).
3.1. Извлекаем элемент из очереди X:=Pop().
3.2.
Pascal
1
2
3
4
5
6
 if X<TempMin then
  begin
    Push(Och, TempMin);
    TempMin:=X;
  end
  else Push(Och, X);
4. После пересмотра всех элементов очереди в TempMin находится элемент, который нужно поместить в стек. Помещаем.
5. Выполняем пункты 1-4 до опустошения очереди.
6. Теперь у нас пустая очередь и заполненный отсортированными по возрастанию числами стек.

Ну и не забудь сделать процедуры очистки памяти от содержимого очереди и стека - иначе и в Windows память закончится.
1
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8645 / 4480 / 1669
Регистрация: 01.02.2015
Сообщений: 13,888
Записей в блоге: 11
30.12.2015, 20:51
Что-то дюже много благодарностей да ещё и в разные дни за простой совет.
Если совет помог, лучше, покажите для других результат, похвастайтесь...
А если не помог, то покажите на чём остановились.
0
0 / 0 / 0
Регистрация: 19.09.2015
Сообщений: 45
10.04.2016, 23: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
uses crt;
const k=100;
type oc=^Ochered;
     Ochered=record
             data:integer;
             next:oc;
             end;
     massiv = array[1..k] of integer;
var och:^Ochered; 
    och2:^Ochered;
    mas:massiv;
    l:integer;
    Oc1:oc;
  
procedure AddElemOchered(var Oc1:oc); 
var cur:oc;
    x,i:integer;
    c:char;
begin
new(Oc1);
writeln('Введите целое число, для добавления в очередь');
readln(x);
Oc1^.data:=x;
Oc1^.next:=nil;
Writeln('Введите целое число, для добавления в очередь. Для выхода введите «0»');
readln(x);
if (x<>0) then
 begin cur:=Oc1;
   repeat
     new(cur^.next);
     cur:=cur^.next;
     cur^.data:=x;
     cur^.next:=nil;
     readln(x);
   until x=0;
end;
end;
 
function MasOchered(Oc1:oc):integer;
var cur:oc;
    i:integer;
begin
cur:=Oc1;
i:=1;
  repeat
  mas[i]:=cur^.data;
  i:=i+1;
  cur:=cur^.next;
  until (cur^.next=nil);
mas[i]:=cur^.data;
l:=i;
end;
 
procedure Sortirovka (var mas:massiv); 
var i,j,res:integer;
begin
writeln('Сортировка очереди:');
for j:=1 to l do
for i:=j to l do
if mas[j]< mas[i] then
  begin
  res:=mas[j];
  mas[j]:=mas[i];
  mas[i]:=res;
  end;
for j:=1 to l do
writeln(mas[j]);
end;
 
procedure SozdanieStack(var first:oc; mas:massiv); 
var cur:oc;
    i:integer;
begin
new(first);
first^.data:=mas[1];
first^.next:=nil;
for i:=2 to l do
begin
new(cur);
cur^.data:=mas[i];
cur^.next:=first;
first:=cur;
end;
end;
 
procedure Stack(cur:oc); 
var tmp:oc;
    q,i:integer;
begin
writeln('Стек:');
tmp:=cur;
repeat
writeln(tmp^.data);
tmp:=tmp^.next;
until (tmp^.next = nil);
writeln(tmp^.data);
end;
   
begin 
clrscr;
addElemOchered(och); 
MasOchered(och);
Sortirovka(mas);
SozdanieStack(och2,mas);
Stack(och2);
readkey;
end.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8645 / 4480 / 1669
Регистрация: 01.02.2015
Сообщений: 13,888
Записей в блоге: 11
11.04.2016, 07:48
Я бы сделал так. Но это для FPC (и Turbo) - там всё работает. Попробовал проверить в WDE (это online версия PascalABC.NET), но получил ошибку времени выполнения
Ошибка времени выполнения: Методу "Program1.Program.new(Void* ByRef, Int32)", прозрачному для безопасности, не удалось получить доступ к критически важному методу безопасности "System.Runtime.InteropServices.Marshal. AllocHGlobal(Int32)".
Возможно, у меня нет какой-то части .NET.

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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
program StackAndQueue;
 
type
  TInfo = integer;
  {связанный список}
  PNode = ^TNode;
 
  TNode = record
    Value: TInfo;
    Next:  PNode;
  end;
  {очередь на основе свзанного списка}
  TQueue = record
    Head: PNode;
    Tail: PNode;
  end;
  {стэк на основе связанного списка}
  TStack = PNode;
 
  {---------------------------------------}
  { реализация очереди                    }
  {---------------------------------------}
  procedure QueueInit(var q: TQueue);
  begin
    with q do
    begin
      Head := nil;
      Tail := nil;
    end;
  end;
 
  procedure QueuePut(var q: TQueue; Data: TInfo);
  var
    Temp: PNode;
  begin
    new(Temp);
    Temp^.Next  := nil;
    Temp^.Value := Data;
    if q.Head = nil then
    begin
      q.Head := Temp;
      q.Tail := Temp;
    end
    else
    begin
      q.Tail^.Next := Temp;
    end;
    q.Tail := Temp;
  end;
 
  function QueueGet(var q: TQueue; var Data: TInfo): boolean;
  var
    temp: PNode;
  begin
    QueueGet := (q.Head <> nil);
    if (q.Head <> nil) then
    begin
      Data := q.Head^.Value;
      temp := q.Head;
      q.Head := q.Head^.Next;
      if q.Head = nil then
        q.Tail := nil;
      Dispose(temp);
    end;
  end;
 
  procedure QueueClear(var q: TQueue);
  var
    Tmp1, Tmp2: PNode;
  begin
    Tmp1 := q.Head;
    while Tmp1 <> nil do
    begin
      Tmp2 := Tmp1;
      Tmp1 := Tmp1^.Next;
      Dispose(Tmp2);
    end;
    q.Head := nil;
    q.Tail := nil;
  end;
 
  function QueueEmpty(q: TQueue): boolean;
  begin
    QueueEmpty := (q.Head = nil);
  end;
 
  function QueueCount(q: TQueue): integer;
  var
    Count: integer;
    tmp: PNode;
  begin
    Count := 0;
    tmp := q.Head;
    while tmp <> nil do
    begin
      Inc(Count);
      tmp := tmp^.Next;
    end;
    QueueCount := Count;
  end;
 
  procedure QueueShow(q: TQueue);
  var
    temp: PNode;
  begin
    temp := q.Head;
    Write('A queue length is ', QueueCount(q), ' <');
    while temp <> nil do
    begin
      Write(temp^.Value: 4);
      temp := temp^.Next;
    end;
    writeln('>');
  end;
 
  {---------------------------------------}
  {  реализация стэка                     }
  {---------------------------------------}
  procedure StackInit(var AStack: TStack);
  begin
    AStack := nil;
  end;
 
  function StackIsEmpty(AStack: TStack): boolean;
  begin
    StackIsEmpty := (AStack = nil);
  end;
 
  procedure StackPush(var AStack: TStack; AInfo: TInfo);
  var
    Item: PNode;
  begin
    new(Item);
    Item^.Value := AInfo;
    Item^.Next := AStack;
    AStack := Item;
  end;
 
  function StackPop(var AStack: TStack; var AInfo: TInfo): boolean;
  var
    Item: PNode;
  begin
    StackPop := not StackIsEmpty(AStack);
    if not StackIsEmpty(AStack) then
    begin
      Item  := AStack;
      AInfo := AStack^.Value;
      AStack := AStack^.Next;
      dispose(Item);
    end;
  end;
 
  procedure StackClear(var AStack: TStack);
  var
    TempInfo: TInfo;
  begin
    while not StackIsEmpty(AStack) do
      StackPop(AStack, TempInfo);
  end;
 
  procedure StackShow(AStack: TStack);
  begin
    Write('A stack is <');
    while (AStack <> nil) do
    begin
      Write(AStack^.Value: 4);
      AStack := AStack^.Next;
    end;
    writeln('>');
  end;
 
var
  i: integer;
  Queue: TQueue;
  Stack: TStack;
  MinElem, Temp: TInfo;
begin
  randomize;
  {заполнение очереди}
  QueueInit(Queue);
  for i := 1 to 5 do
  begin
    Temp := random(20);
    QueuePut(Queue, Temp);
  end;
  QueueShow(Queue);
  {инициализация стэка}
  StackInit(Stack);
  {заполнение стэка из очереди}
  while not QueueEmpty(Queue) do
  begin
    QueueGet(Queue, MinElem);
    for i := 1 to QueueCount(Queue) do
    begin
      QueueGet(Queue, Temp);
      if MinElem > Temp then
      begin
        QueuePut(Queue, MinElem);
        MinElem := Temp;
      end
      else
        QueuePut(Queue, Temp);
    end;
    StackPush(Stack, MinElem);
  end;
  {показываем содержимое стэка}
  StackShow(Stack);
  {освобождение выделенной памяти}
  StackClear(Stack);
  QueueClear(Queue);
end.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.04.2016, 07:48
Помогаю со студенческими работами здесь

Сформировать стек из N чисел. Найти сумму нечетных чисел из стека. Результат поместить в стек
Здравствуйте. Помогите, пожалуйста, решить задачу: Сформировать стек из N чисел. Найти сумму нечетных чисел из стека. Результат поместить...

Если x равен вершине «стека», то удалить из «очереди» элемент и поместить его в «стек»
Пожалуйста, помогите решить задачу, написав ее на C#!!! Если x равен вершине «стека», то удалить из «очереди» элемент и поместить его в...

Сформировать стек на основе очереди
написал программу решающую задачу: Дана очередь, элементами которой являются целые числа. На ее основе сформировать стек, элементы...

Из элементов «очереди» сформировать второй «стек»
необходимо из элементов «очереди» сформировать второй «стек» заранее спасибо.

Числа поместить в двунаправленный список в порядке возрастания
Известно, что дан массив целых чисел, заданных рандомно. Эти числа поместить в двунаправленный список в порядке возрастания, а затем эти же...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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 - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru