С Новым годом! Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
 Аватар для Кейт Либби
4 / 3 / 1
Регистрация: 16.10.2011
Сообщений: 69

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

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

Студворк — интернет-сервис помощи студентам
Дано указатели p1 и p2 на вершинах двух непустых стеков. Переместить все элементы из первого стека в другой (в результате элементы первого стека будут располагаться во втором стеке в порядке, обратном выходном), вывести адрес новой вершины второго стека.
Операции выделения и освобождения памяти не использовать.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.02.2012, 18:17
Ответы с готовыми решениями:

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

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

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

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

Решение

Я конечно заранее извиняюсь если что-то не так, но первая ссылка в гугле выдала в точности Ваше задание и код к нему.
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
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
16.02.2012, 13:51
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.02.2012, 13:51
Помогаю со студенческими работами здесь

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

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

Перепишите элементы одного массива в другой и подсчитайте их число
перепишите элементы массива x в массив y и подсчитайте их число Массив x(7) условия и ограничения -1&lt;=Xi&lt;=1

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru