IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Динамическая память!!
сообщение
Сообщение #1


Гость






                      Срочно помогите PLEASE!!!!
                                                       Задача
 Разработать прогу слияния 2-ух стеков, содержащих возрастающую последовательность целых положительных чисел, в третий стек, так, чтобы его элементы распологались также в порядке возрастания.
                                   (Как создать стек и как объеденить два стека в третий???????)
     ??????????                                                                                                                                ???????????????
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 930
Пол: Мужской

Репутация: -  11  +


Ну, стек можно рассматривать как массив переменных с определёнными свойствами: запись, чтение как у стека. Запиши информацию в 2 стека(массива), а потом считывай её с конца в буфер(настоящий массив). Из буфера рассортируй и перекатай в третий стек.
А можно обойтись без третьего массива(стека) - 2 первых стека располагаются в одном
большом массиве. А перед записью из буфера эти стеки исчезают, а на их месте образуется один большой стек.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 62
Пол: Мужской

Репутация: -  1  +


Сказано использовать динамические структуры - значит использовать.
Стак - такая штука данные в которую добавляются и считываются по правилу FILO. То есть самый "свежий" всегда наверху и доступен для чтения. При слиянии 2х стеков получтся новый "длинный" стек, но упорядоченность будет обратная. Чтобы её изменить понадобится новый стек. Когда данные из стека считываются - стек постепенно "разбирается". То есть в конце операций все стеки (включая промежуточный) исчезнут. Получится новый, правильный, удовлетворяющий всем требованиям стек.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Прогрессор
****

Группа: Пользователи
Сообщений: 602
Пол: Мужской
Реальное имя: Михаил

Репутация: -  9  +


Чтобы создать именно ДИНАМИЧЕСКИЙ стек, т.е. с возможностью добавлять неограниченное количество элементов, надо реализовать его на основе одностороннего или 2стороннего списка. Последний элемент списка - верхушка стека. При 1стороннем списке неудобно вытаскивать элемент стека - при этом текущий указатель списка "повисает", и приходится ставить его в начало и прогонять по всему списку до нового конца. При 2стороннем в этом случае указатель просто делает шаг назад - на предыдущий элемент, становящийся новой верхушкой стека.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Бывалый
***

Группа: Пользователи
Сообщений: 180
Пол: Мужской

Репутация: -  2  +


Код
type
PStack=^TStack;
TStack=record v: integer; p: PStack end;

var st1,st2,st3: PStack;

procedure push(var st: PStack; x: integer);
var nst: PStack;
begin
new(nst);
nst^.p:=st;
st:=nst;
st^.v:=x;
end;

function pop(var st: PStack): integer;
var nst: PStack;
begin
pop:=st^.v;
nst:=st;
st:=st^.p;
dispose(nst);
end;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Бывалый
***

Группа: Пользователи
Сообщений: 180
Пол: Мужской

Репутация: -  2  +


чтобы сформировать третий стек, берем элементы поочередно из первого или из второго (в зависимости от того, где значение больше(меньше), чтобы сохранить порядок) до тех пор, пока они не кончатся(т.е. соответствующий st будет равен nil) и ложим в третий
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Прогрессор
****

Группа: Пользователи
Сообщений: 602
Пол: Мужской
Реальное имя: Михаил

Репутация: -  9  +


Массаракш! Конечно же P@sh@ прав: гораздо разумнее сделать верхушку стека не концом, а началом односвязного списка. Что- то торможу я в последнее время. :-/
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Прогрессор
****

Группа: Пользователи
Сообщений: 602
Пол: Мужской
Реальное имя: Михаил

Репутация: -  9  +


Ну и, прежде чем извлекать элемент, надо проверять стек на пустоту

Код

function IsEmpty(st:PStack):boolean; {true - список пуст}
begin
IsEmpty:=(st=nil);
end;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 




- Текстовая версия 19.09.2017 22:23
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"