Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/23: Рейтинг темы: голосов - 23, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 07.02.2012
Сообщений: 27
1

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

27.05.2012, 23:10. Просмотров 4377. Ответов 2

Даны четыре стека.Два первых стека пустые,а в двух других находятся натуральные числа.В первый пустой стек поместить четные числа в порядке неубывания,взятые из непустых стеков,во второй пустой стек поместить нечетные числа в порядке невозрастания,так же взятые их непустых стеков.Предполагается,что множества четных чисел и нечетных чисел непустые.
НАпишет кто нибудь программу?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.05.2012, 23:10
Ответы с готовыми решениями:

Поместить четные элементы в один стек, нечетные - во второй
Дан стек, заполненный целыми числами. Поместить четные элементы в один стек, нечетные - во второй....

Созданный список разделить на два: в первый поместить четные, а во второй — нечетные числа
Написать программу по созданию, добавлению, просмотру однонаправленного линейного списка типа СТЕК....

Поместить в два линейных односвязных списка: в первый - чётные по порядку числа, во второй - нечётные
Разработайте программу, которая вводит с клавиатуры ввода целые числа и помещает их в два линейных...

Преобразовать стек в два стека. Первый должен содержать только четные числа, а второй – нечетные
Сессия грядет , ребята выручайте! 2. Сформировать динамический список (стек), считая, что длина...

2
13041 / 5827 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
28.05.2012, 15:27 2
Лучший ответ Сообщение было отмечено Rampag как решение

Решение

Я сделал так. Первые два стека PSt1 и PSt2 заполняются случайными натуральными числами. Затем, из них в стек PSt3 переливаются нечётные числа, а в стек PSt4 - чётные. Потом, стек PSt3 сортируется по невозрастанию, а стек PSt4 - по неубыванию. На всех этапах стеки распечатываются на экране. Код можно сократить, если сортировку оформить в виде подпрограммы.
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
program Project1;
 
type
  //Тип основных данных.
  TData = Integer;
 
  //Указатель на элемент стека.
  TPElem = ^TElem;
  //Элемент стека.
  TElem = record
    Data : TData;
    PNext : TPElem;
  end;
 
//Добавление элемента на вершину стека.
procedure Push(var aPStack, aPElem : TPElem);
begin
  if aPElem = nil then Exit;
  aPElem^.PNext := aPStack;
  aPStack := aPElem
end;
 
//Изъятие элемента с вершины стека.
//Если стек не пуст, то с вершины стека изымается элемент и возвращается
//через параметр aPElem. В этом случае, функция возвращает значение True.
//Если стек пуст, то операция отменяется, а функция возвращает значение False.
function Pop(var aPStack, aPElem : TPElem) : Boolean;
begin
  Pop := False;
  if aPStack = nil then Exit;
  aPElem := aPStack;
  aPStack := aPElem^.PNext;
  Pop := True;
end;
 
//Удаление стека из памяти (очистка стека).
procedure StackFree(var aPStack : TPElem);
var
  PElem : TPElem;
begin
  while Pop(aPStack, PElem) do Dispose(PElem);
end;
 
//Распечатка стека.
procedure StackPrint(var aPStack : TPElem);
var
  PSt, PElem : TPElem;
  i : Integer;
begin
  if aPStack = nil then begin
    Writeln('Стек пуст.');
    Exit;
  end;
  //Начальная инициализация вспомогательного стека.
  PSt := nil;
  //Переливаем все элементы стека aPStack в стек PSt и выполняем распечатку.
  i := 0;
  while Pop(aPStack, PElem) do begin
    Push(PSt, PElem);
    Inc(i);
    if i > 1 then Write(', ');
    Write(PElem^.Data);
  end;
  Writeln;
  //Возвращаем элементы из стека PSt в стек aPStack. При этом, элементы
  //в стеке aPStack окажутся в том же порядке, в каком они были до распечатки.
  while Pop(PSt, PElem) do Push(aPStack, PElem);
end;
 
const
  //Количество элементов, с которым мы будем работать.
  M = 5;
var
  PSt1, PSt2, PSt3, PSt4, PElem, PElem1, PElem2 : TPElem;
  i : Integer;
  F : Boolean;
  S : String;
begin
  //Начальная инициализация стеков.
  PSt1 := nil;
  PSt2 := nil;
  PSt3 := nil;
  PSt4 := nil;
 
  repeat
    //Формируем содержимое двух стеков.
    Randomize;
    for i := 1 to M do begin
      New(PElem);
      PElem^.Data := 1 + Random(20); //1..20.
      Push(PSt1, PElem);
      New(PElem);
      PElem^.Data := 1 + Random(20); //1..20.
      Push(PSt2, PElem);
    end;
 
    //Распечатка стеков.
    Writeln('Исходное состояние непустых стеков:');
    Writeln('Первый стек:');
    StackPrint(PSt1);
    Writeln('Второй стек:');
    StackPrint(PSt2);
    Writeln('---');
 
    //Переливаем из стека PSt1 нечётные элементы в стек PSt3,
    //а чётные - в стек PSt4.
    while Pop(PSt1, PElem) do
      if PElem^.Data mod 2 = 0 then
        Push(PSt4, PElem)
      else
        Push(PSt3, PElem);
    //Переливаем из стека PSt2 нечётные элементы в стек PSt3,
    //а чётные - в стек PSt4.
    while Pop(PSt2, PElem) do
      if PElem^.Data mod 2 = 0 then
        Push(PSt4, PElem)
      else
        Push(PSt3, PElem);
 
    Writeln('Выполнено переливание в третий и четвёртый стеки:');
    Writeln('Третий стек:');
    StackPrint(PSt3);
    Writeln('Четвёртый стек:');
    StackPrint(PSt4);
    Writeln('---');
 
    //Теперь стеки PSt1 и PSt2 - пустые. Стек PSt1 будем исполозовать
    //для сортировки элементов в стеках PSt3 и PSt4.
 
    //Сортировка стека St3 по невозрастанию в направлении вершина - дно.
    //Метод сортировки - пузырьковая.
    repeat
      F := False;
      //Берём очередной элемент из стека PSt3. Записываем его в PElem1.
      if Pop(PSt3, PElem1) then begin
        //Далее делаем так. Берём ещё один элемент стека PSt3, записываем
        //его в PElem2. Сравниваем PElem1 и PElem2, и большее значение пишем
        //в стек PSt1. Оставшееся значение помещаем в PElem1.
        //Продолжаем выполнять эту операцию до достижения дна стека PSt3.
        while Pop(PSt3, PElem2) do begin
          if PElem1^.Data >= PElem2^.Data then begin
            Push(PSt1, PElem1);
            PElem1 := PElem2;
          end else begin
            Push(PSt1, PElem2);
            //True - означает, что элементы в стеке поменяли позицию.
            F := True;
          end;
        end;
        //Записываем в PSt3 зачение, оставшееся в PElem1.
        Push(PSt3, PElem1);
        //Переливаем в PSt3 все элементы из PSt1.
        while Pop(PSt1, PElem1) do Push(PSt3, PElem1);
      end;
    until not F;
 
    //Сортировка стека St4 по неубыванию в направлении вершина - дно.
    //Метод сортировки - пузырьковая.
    repeat
      F := False;
      if Pop(PSt4, PElem1) then begin
        while Pop(PSt4, PElem2) do begin
          if PElem1^.Data <= PElem2^.Data then begin
            Push(PSt1, PElem1);
            PElem1 := PElem2;
          end else begin
            Push(PSt1, PElem2);
            F := True;
          end;
        end;
        Push(PSt4, PElem1);
        while Pop(PSt1, PElem1) do Push(PSt4, PElem1);
      end;
    until not F;
 
    //Распечатка стеков.
    Writeln('Трейтий и четвётрый стеки после сортировки.');
    Writeln('Третий стек:');
    StackPrint(PSt3);
    Writeln('Четвёртый стек:');
    StackPrint(PSt4);
    Writeln('---');
 
    //Удаление стеков из памяти.
    StackFree(PSt1);
    StackFree(PSt2);
    StackFree(PSt3);
    StackFree(PSt4);
    Writeln('Работа завершена. Стеки удалёны из памяти.');
 
    Writeln('Повторить - Enter. Выход - любой символ + Enter.');
    Readln(S);
  until S <> '';
end.
Если нужна процедура сортировки, её можно реализовать так:
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
//Сортировка стека. Метод сортировки - пузырьковая.
//aAsc = True - сортировка по неубыванию в направлении вершина - дно.
//aAsc = False - сортировка по невозрастанию в направлении вершина - дно.
procedure Sort(var aPStack : TPElem; const aAsc : Boolean);
var
  PSt, PElem1, PElem2 : TPElem;
  F, FAsc : Boolean;
begin
  //Начальная инициализация вспомогательного стека.
  PSt := nil;
  //Сортировка.
  repeat
    F := False;
    //Берём очередной элемент из стека aPStack. Записываем его в PElem1.
    if Pop(aPStack, PElem1) then begin
      //Далее делаем так. Для случая сортировки по неубыванию.
      //Берём ещё один элемент стека aPStack, записываем его в PElem2.
      //Сравниваем PElem1 и PElem2, и меньшее значение пишем в стек PSt.
      //Оставшееся значение помещаем в PElem1. Продолжаем выполнять
      //эту операцию до достижения дна стека aPStack.
      while Pop(aPStack, PElem2) do begin
        if aAsc then
          FAsc := PElem1^.Data <= PElem2^.Data
        else
          FAsc := PElem1^.Data >= PElem2^.Data
        ;
        if FAsc then begin
          Push(PSt, PElem1);
          PElem1 := PElem2;
        end else begin
          Push(PSt, PElem2);
          //True - означает, что элементы в стеке поменяли позицию.
          F := True;
        end;
      end;
      //Записываем в aPStack зачение, оставшееся в PElem1.
      Push(aPStack, PElem1);
      //Переливаем в aPStack все элементы из PSt.
      while Pop(PSt, PElem1) do Push(aPStack, PElem1);
      //Теперь PSt пуст.
    end;
  until not F;
end;
Пример вызова:
Pascal
1
2
3
4
  //Сортировка стека St3 по невозрастанию в направлении вершина - дно.
  Sort(PSt3, False);
  //Сортировка стека St4 по неубыванию в направлении вершина - дно.
  Sort(PSt4, True);
2
0 / 0 / 0
Регистрация: 07.02.2012
Сообщений: 27
28.05.2012, 19:20  [ТС] 3
Спасибо!!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.05.2012, 19:20

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

Поместить в первый стек положительные элементы, а во второй — отрицательные
Здравствуйте, помогите решить задачу. Ввести с клавиатуры 12 чисел, поместив в первый стек...

Преобразовать стек в два стека - первый должен содержать только чётные числа, второй — только нечётные
Здравствуйте!! Нужно создать стек в диапазоне -50 до 50.Преобразовать стек в два стека.Причем,...

Разделить список на 2, в первый поместить четные элементы исходного списка, во второй - нечетные
Помогите пожалуйста, написать программу переносящую все нечетные элементы одномерного числового...

В новый стек поместить элементы, лежащие во второй половине первого стека
Создать стек с числами в диапазоне от –50 до +50. После создания стека выполнить индивидуальное...


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

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

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