Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 28.10.2013
Сообщений: 7
1

Задача со Стеком и Очередью

24.02.2014, 13:08. Просмотров 754. Ответов 7
Метки нет (Все метки)

Доброго времени суток, прошу помочь в решении задачи, ума не приложу как решать её. = ((

Дана последовательность из N различных целых чисел, занесённых в стек. Найти сумму её членов расположенных между максимальным и минимальным значениями (в сумму включить и оба этих числа). Для промежуточного хранения элементов из стека использовать очередь.

Если кто то возьмётся, вот модуль с типовыми операциями для стека и очереди.
Или подскажите алгоритм решения.

Delphi
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
unit Unit1;
 
interface
  type sv = ^zv;
       zv = record info:integer;
                   link:sv;
        end;
 
procedure add_o(x:integer; var l,r: sv);
procedure form_o(out l,r:sv);
procedure del_o(var l,r:sv; out x:integer);
procedure Viv_o(var L,R:sv);
procedure add_stack(x:integer; var stack:sv);
procedure form_stack(out stack:sv);
procedure del_stack(var stack: sv; var x:integer);
Procedure Viv_stack(var stack:sv);
 
implementation
 
 
procedure add_o(x:integer; var l,r: sv);
 var u_z: sv;
 begin
   new(u_z);
   u_z^.info:=x;
   u_z^.link:=nil;
 
 if l=nil then
 begin
   u_z^.link:=nil;
   l:=u_z;
   r:=u_z;
 end
 else
 begin
  r^.link:=u_z;
  r:=u_z;
 end;
 end;
 
 
 
 procedure  form_o(out l,r:sv);
var x:integer;
begin
    r:=nil;
    l:=nil;
    Readln(x);
    while x<>0 do
    begin
      Add_o(x,l,r);
      Readln(x);
    end;
end;
 
  procedure del_o(var L,R:sv; out x:Integer);
  var     U_z :sv;
  begin
        if l<>nil then
 
        if l=r then
          begin
            x:= l^.info;
            Dispose(l);
            l:= nil;
            r:= nil;
          end
          else
          begin
             x:= l^.info;
            u_z:=l;
            l:=l^.link;
           Dispose(U_z);
          end
          else
          Writeln('PUSTO');
  end;
 
 
 
Procedure Viv_o(var L,R:sv);
  var   x:Integer;
 begin
writeln('Ochered:');
 while L <>  nil do
begin
 del_o(L,R,x);
writeln(x);
 
end;
writeln;
end;
 
 
 
 
procedure add_stack(x:integer; var stack:sv);
var u_z:sv;
begin
  new(u_z);
  u_z^.info:=x;
  u_z^.link:=stack;
  stack:=u_z;
end;
 
 
procedure form_stack(out stack:sv);
var x:integer;
  U_z:sv;
  begin
  stack:=nil  ;
  Readln(x);
 
     while x<>0 do
     begin
       add_stack(x, stack);
       Readln(x);
     end;
       end;
procedure del_stack(var stack: sv; var x:integer);
 var u_z:sv;
 begin
   if stack<>nil then
            begin
              u_z:=stack;
              x:=stack^.info;
              stack:=stack^.link;
              dispose(u_z);
                            end
      else writeln('pusto!');
      end;
 
 
Procedure Viv_stack(var stack:sv);
  var   x:Integer;
 begin
writeln('stack:');
 while stack <>  nil do
begin
 del_stack(stack,x);
writeln(x);
 
end;
writeln;
end;
 
 
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.02.2014, 13:08
Ответы с готовыми решениями:

Работа со стеком и очередью
Вот такое вот задание: Система состоит из процессора P, трёх очередей F0, F1, F2 и стека S. В...

Прокомментировать код, работающий с очередью и стеком
Доброго времени суток. Есть код, работающий с очередью и стеком. Я не могу понять как он работает,...

Реализовать абстрактный класс "Список" стеком/очередью
Доброго времени суток, форумчане! Нужно реализовать абстрактный класс &quot; Список &quot; и выполнить две...

Нужны задачки для упражнения в работе со списком, стеком, очередью и двусвязным списком
Недавно научился строить список, стек, очередь, двусвязный список в С++, что бы закрепить навыки...

7
291 / 263 / 47
Регистрация: 09.04.2013
Сообщений: 997
24.02.2014, 13:52 2
Для работы со стеком обычно делают функцию с именем pop и процедуру с именем push, для очереди, наверное, также. Это не является требованием, просто общепринятое (распространенное) именование, также как и использование переменных с именами i и j для итераций.

Ну-с.
Дано: стек с цифрами.
Следовательно сначала тебе нужно заполнить стек какими-то значениями, там рандомом или с клавиатуры, сам выбирай по постановке задачи.
Решение:
По одному вытаскиваем числа из стека, ищем максимум и минимум, и записываем в очередь.
Когда стек пуст - следовательно мы нашли максимум и минимум. Теперь беремся за очередь. По одному вытаскиваем числа и сверяем с максимумом и минимумом. Как только встретили первое число равное максимуму или минимуму - его и все последующие прибавляем к сумме, и ждем пока очередное число станет равным про минимуму или максимуму соответственно (т.е. наоборот от первого), добавляем его в сумму и останавливаем алгоритм.
1
0 / 0 / 0
Регистрация: 28.10.2013
Сообщений: 7
24.02.2014, 17:30  [ТС] 3
wingblack,
организовал ввод в стек и переброску чисел в очередь с поиском минимума и максимума, а вот как сложить получившийся диапазон понять не могу.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TForm1.Button2Click(Sender: TObject);
begin
while (o_l=nil) and (o_r=nil) do
begin
del_o(o_l,o_r,x);
if (x=min) or (x=max) then
begin
 
 s:=s+x;
 
 
 
end;
end;
label1.Caption:='Сумма диапазона с '+inttostr(min)+' до '+inttostr(max)+' равна '+(inttostr(s));
 
end;
Добавлено через 1 час 35 минут
Прикрутил вот такой костыль, работает =))
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure TForm1.Button2Click(Sender: TObject);
var flag:boolean;
begin
flag:=false;
while (o_l<>nil) do
begin
 del_o(o_l,o_r,x);
 if (x=min) or (x=max) then flag:=true;
 if flag then
     begin
       if s=0 then s:=s+x
       else
        begin
          s:=s+x;
          if (x=min) or (x=max) then flag:=false;
        end;
     end;
 
end;
label1.Caption:='Сумма диапазона с '+inttostr(min)+' до '+inttostr(max)+' равна '+(inttostr(s));
 
end;
0
291 / 263 / 47
Регистрация: 09.04.2013
Сообщений: 997
26.02.2014, 18:00 4
Delphi
1
 if s=0 then s:=s+x
На ноль проверять не надо, пока у тебя программа находится в данном месте кода - тебе нужно считать сумму, да и в текущей реализации s:=s+x у тебя выполняется в любом случае

Не по теме:

Цитата Сообщение от Hellblazer Посмотреть сообщение
del_o(o_l,o_r,x);
такие беспалевные смайлики в коде

0
0 / 0 / 0
Регистрация: 28.10.2013
Сообщений: 7
26.02.2014, 21:31  [ТС] 5
wingblack, Проверка на ноль для того что бы понять первый ли раз встретили мин или макс, ведь не известно что именно нам встретиться, поэтому условие двойное, а когда s не ноль и мы опять встретили мин или макс, то тут и заканчивать можно. =))
0
291 / 263 / 47
Регистрация: 09.04.2013
Сообщений: 997
28.02.2014, 09:31 6
Цитата Сообщение от Hellblazer Посмотреть сообщение
wingblack, Проверка на ноль для того что бы понять первый ли раз встретили мин или макс, ведь не известно что именно нам встретиться, поэтому условие двойное, а когда s не ноль и мы опять встретили мин или макс, то тут и заканчивать можно. =))
Delphi
1
2
3
4
5
6
7
8
 begin
       if s=0 then s:=s+x
       else
        begin
          s:=s+x;
          if (x=min) or (x=max) then flag:=false;
        end;
     end;
равносильно коду
Delphi
1
2
3
4
5
 
       begin
       s:=s+x;
       if (s<>0) and ( (x=min) or (x=max) ) then flag:=false;
     end;
А еще можно считать количество элементов между минимумом и максимумом, и на этапе работы с очередью сначала найти минимум/максимум, а потом без дополнительных условий взять столько элементов сколько нужно.
0
0 / 0 / 0
Регистрация: 28.10.2013
Сообщений: 7
28.02.2014, 09:41  [ТС] 7
Цитата Сообщение от wingblack Посмотреть сообщение
Код Delphi

begin
s:=s+x;
if (s<>0) and ( (x=min) or (x=max) ) then flag:=false;
end;
Нет, так не получится.
По вашему алгоритму мы встречаем мин или макс, поднимаем флаг, прибавляем х к s и дальше ваше условие (s<>0) and ( (x=min) or (x=max) ) и так получается что оно нам подходит, так как с мин и макс мы ещё не сдвинулись и к s уже прибавили, то и флаг тут же в фолс выставляем, на это собственно наш подсчёт завершается =))
0
291 / 263 / 47
Регистрация: 09.04.2013
Сообщений: 997
28.02.2014, 10:28 8
Цитата Сообщение от Hellblazer Посмотреть сообщение
Нет, так не получится.
По вашему алгоритму мы встречаем мин или макс, поднимаем флаг, прибавляем х к s и дальше ваше условие (s<>0) and ( (x=min) or (x=max) ) и так получается что оно нам подходит, так как с мин и макс мы ещё не сдвинулись и к s уже прибавили, то и флаг тут же в фолс выставляем, на это собственно наш подсчёт завершается =))
О, точно. Тогда так
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
begin
       if (s<>0) and ( (x=min) or (x=max) ) then flag:=false;
       s:=s+x;
     end;
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.02.2014, 10:28

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Задача с очередью
Помогите, пожалуйста, с задачей: В очереди стоят три транзакта с номерами 1,2 и3. В момент...

Задача со стеком
Помогите, пожалуйста, со стеком. Нужно разработать процедуру, которая будет формировать стек...

задача со стеком
Из двух заданных стеков, хранящих символы, создать новый стек из тех символов первого стека,...

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.