4 / 3 / 1
Регистрация: 16.10.2011
Сообщений: 69
1

Переместить элементы из одного стека в другой

15.02.2012, 18:17. Показов 5166. Ответов 2

Дано указатели p1 и p2 на вершинах двух непустых стеков. Переместить все элементы из первого стека в другой (в результате элементы первого стека будут располагаться во втором стеке в порядке, обратном выходном), вывести адрес новой вершины второго стека.
Операции выделения и освобождения памяти не использовать.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.02.2012, 18:17
Ответы с готовыми решениями:

Переместить элементы из первого стека во второй
Даны указатели P1 и P2 на вершины двух непустых стеков. Переместить все элементы из первого стека...

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

Скопировать элементы из одного массива в другой
Пусть описана константа и два типа-массива: const m = 3; type TMas1 = array of real;...

Переставить некоторые элементы из одного массива в другой
Привет, программисты. Наткнулся на легчайшую затычку, которую решит наверное любой, кроме меня,...

2
4299 / 1421 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
15.02.2012, 19:48 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Я конечно заранее извиняюсь если что-то не так, но первая ссылка в гугле выдала в точности Ваше задание и код к нему.
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
uses crt;
type
   TMyType = integer;
   TStack = ^TNode;
   TNode = record
      value: TMyType;
      next: TStack;
   end;
{-----------------------------------------------}
{Занесение элемента в стек}
procedure Push(var theStack: TStack; theValue: TMyType);
var
   node: TStack;
begin
   new(node);
   node^.value := theValue;
   node^.next := theStack;
   theStack := node;
end;
{-----------------------------------------------}
{Вывод наэкран всех элементов стека}
procedure Print(theStack: TStack);
var
   node: TStack;
begin
   node := theStack;
 
   while (node <> nil) do
   begin
      write(node^.value:3);
      node := node^.next;
   end;
 
   writeln;
end;
{-----------------------------------------------}
{Формирование стека заданной длинны. Формируется случайным образом}
procedure PushRandomValue(var theStack: TStack; theCount: word);
var
   i: byte;
begin
   theStack := nil;
 
   for i:= 1 to theCount do
   begin
      Push(theStack, random(2*theCount) + 1);
   end;
end;
{-----------------------------------------------}
{Перемещение элементов одного стека в другой}
procedure Move(var theStackTo, theStackFrom: TStack);
var
   node: TStack;
begin
   while (theStackFrom <> nil) do
   begin
      node := theStackFrom;
      theStackFrom := theStackFrom^.next;
      node^.next := theStackTo;
      theStackTo := node;
   end;
end;
{-----------------------------------------------}
var
  stack1, stack2: TStack;
begin
   randomize;
   PushRandomValue(stack1, random(7) + 3);
   PushRandomValue(stack2, random(7) + 3);
 
   write('[1] : ');
   Print(stack1);
   write('[2] : ');
   Print(stack2);
   writeln;
 
   Move(stack2, stack1);
 
   write('[1] : ');
   Print(stack1);
   write('[2] : ');
   Print(stack2);
end.
Единственное, что тут надо сделать - избавиться от выделений и освобождения памяти.
2
13087 / 5868 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
16.02.2012, 13:51 3
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

BumerangSP, в этом коде требуются переделки. И с точки зрения архитектуры стека реализация там неверная. - Работа со стеком всегда должна осуществляться через функции: Push() (запись на вершину) и Pop() (чтение с вершины). А в представленном коде функция Pop() вообще не реализована. В процедурах Print() и Move() вместо техники "переливания" выполняется прямой доступ к элементам стека. Кроме этого, программа не освобождает взятую у системы память - нет ни одного вызова Dispose().
---
В общем, предлагаю способ, где всё сделано, как положено. Стек реализован на односвязанном списке.
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
program Project1;
 
type
  //Тип основных данных.
  TData = Integer;
 
  //Указатель на элемент стека.
  TPElem = ^TElem;
  //Элемент стека.
  TElem = record
    Data : TData;
    PNext : TPElem;
  end;
 
//Добавление элемента на вершину стека.
procedure StackPush(var aPStack, aPElem : TPElem);
begin
  if aPElem = nil then Exit;
  aPElem^.PNext := aPStack;
  aPStack := aPElem
end;
 
//Изъятие элемента с вершины стека.
//Если стек не пуст, то с вершины стека изымается элемент и возвращается
//через параметр aPElem. В этом случае, функция возвращает значение True.
//Если стек пуст, то операция отменяется, а функция возвращает значение False.
function StackPop(var aPStack, aPElem : TPElem) : Boolean;
begin
  StackPop := False;
  if aPStack = nil then Exit;
  aPElem := aPStack;
  aPStack := aPElem^.PNext;
  StackPop := True;
end;
 
//Удаление стека из памяти (очистка стека).
procedure StackFree(var aPStack : TPElem);
var
  PElem : TPElem;
begin
  while StackPop(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 StackPop(aPStack, PElem) do begin
    StackPush(PSt, PElem);
    Inc(i);
    if i > 1 then Write(', ');
    Write(PElem^.Data);
  end;
  Writeln;
  //Возвращаем элементы из стека PSt в стек aPStack. При этом, элементы
  //в стеке aPStack окажутся в том же порядке, в каком они были до распечатки.
  while StackPop(PSt, PElem) do StackPush(aPStack, PElem);
end;
 
const
  //Глубина стека.
  M = 10;
var
  PSt1, PSt2, PElem : TPElem;
  i : Integer;
  S : String;
begin
  //Начальная инициализация стеков.
  PSt1 := nil;
  PSt2 := nil;
 
  repeat
    //Формируем содержимое первого стека.
    Randomize;
    for i := 1 to M do begin
      New(PElem);
      PElem^.Data := Random(10); //0..9.
      StackPush(PSt1, PElem);
    end;
 
    //Распечатка стеков.
    Writeln('Первый стек:');
    StackPrint(PSt1);
    Writeln('Второй стек:');
    StackPrint(PSt2);
 
    //Переливаем все элементы стека PSt1 в стек PSt2.
    while StackPop(PSt1, PElem) do StackPush(PSt2, PElem);
 
    //Распечатка стеков.
    Writeln('Выполнено переливание из певого стека - во второй.');
    Writeln('Первый стек:');
    StackPrint(PSt1);
    Writeln('Второй стек:');
    StackPrint(PSt2);
 
    //Удаление стеков из памяти.
    StackFree(PSt1);
    StackFree(PSt2);
    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
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
program Project1;
 
const
  //Наибольшая глубина стека. Т. е. максимальное количество элементов,
  //которое может поместиться в стек.
  StSizeMax = 30;
 
type
  //Тип, описывающий стек.
  TStack = record
    //Указатель вершины стека. Это индекс последнего добавленного элемента.
    Pnt : Integer;
    //Контейнер данных стека.
    Data : array[1..StSizeMax] of Integer;
  end;
 
//Добавить элемент на вершину стека.
function StackPush(var aSt : TStack; const aNum : Integer) : Boolean;
begin
  StackPush := False;
  if not (aSt.Pnt < High(aSt.Data)) then Exit;
  //Индекс добавляемого элемента.
  Inc(aSt.Pnt);
  //Добавляем элемент в массив (т. е. в стек).
  aSt.Data[aSt.Pnt] := aNum;
  StackPush := True;
end;
 
//Взять элемент с вершины стека.
function StackPop(var aSt : TStack; var aNum : Integer) : Boolean;
begin
  StackPop := False;
  if aSt.Pnt < Low(aSt.Data) then Exit;
  aNum := aSt.Data[aSt.Pnt];
  Dec(aSt.Pnt);
  StackPop := True;
end;
 
//Удаление стека из памяти (очистка стека).
procedure StackInit(var aSt : TStack);
begin
  aSt.Pnt := Low(aSt.Data) - 1;
end;
 
//Распечатка стека.
procedure StackPrint(var aSt : TStack);
var
  St : TStack;
  Elem : Integer;
  i : Integer;
begin
  if aSt.Pnt < Low(aSt.Data) then begin
    Writeln('Стек пуст.');
    Exit;
  end;
  //Инициализация вспомогательного стека.
  StackInit(St);
  //Переливаем все элементы стека aSt в стек St и выполняем распечатку.
  i := 0;
  while StackPop(aSt, Elem) do begin
    StackPush(St, Elem);
    Inc(i);
    if i > 1 then Write(', ');
    Write(Elem);
  end;
  Writeln;
  //Возвращаем элементы из стека St в стек aSt. При этом, элементы
  //в стеке aSt окажутся в том же порядке, в каком они были до распечатки.
  while StackPop(St, Elem) do StackPush(aSt, Elem);
end;
 
const
  //Глубина стека.
  M = 10;
var
  St1, St2 : TStack;
  i, Elem : Integer;
  S : String;
begin
  //Инициализация стеков.
  StackInit(St1);
  StackInit(St2);
 
  repeat
    //Формируем содержимое стека.
    Randomize;
    for i := 1 to M do begin
      if not StackPush(St1, Random(10)) then begin
        Writeln('Переполнение стека. Всего записано элементов: ', i - 1);
        Break;
      end;
    end;
 
    //Распечатка стеков.
    Writeln('Первый стек:');
    StackPrint(St1);
    Writeln('Второй стек:');
    StackPrint(St2);
 
    //Переливаем все элементы стека PSt1 в стек PSt2.
    while StackPop(St1, Elem) do StackPush(St2, Elem);
 
    //Распечатка стеков.
    Writeln('Выполнено переливание из певого стека - во второй.');
    Writeln('Первый стек:');
    StackPrint(St1);
    Writeln('Второй стек:');
    StackPrint(St2);
 
    //Здесь удаление стеков из памяти не трубется, так как стеки реализованы
    //на статических массивах. Но, тем не менее, для общности подхода
    //выполним очистку стеков.
    StackInit(St1);
    StackInit(St2);
    Writeln('Работа завершена. Стеки обнулены.');
 
    Writeln('Повторить - Enter. Выход - любой символ + Enter.');
    Readln(S);
  until S <> '';
end.
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.02.2012, 13:51
Помогаю со студенческими работами здесь

Из одного файла переписать в другой заданные элементы
Здравствуйте, необходимо составить программу

Перепишите элементы одного массива в другой и подсчитайте их число
перепишите элементы массива x в массив y и подсчитайте их число Массив x(7) условия и ограничения...

Из одного массива в другой переписать сначала положительные элементы, затем отрицательные
program P7; uses crt; var Z: array of integer; R: array of integer; i,k: integer; Begin...

Из одного массива в другой переписать элементы, модуль которых меньше среднего значения
Помогите пожалуйста!=) Из массива а(100) в массив b(100) переписать элементы модулькоторых...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru