Перейти к содержанию
    

стек произвольной глубины

Здравствуйте, уважаемые форумчане.

 

Цель простая, но в своих идеях не уверен.

 

Хочу организовать стек произвольной глубины с динамической памятью. Будет класс стека. Но ведь когда мы выделяем динамическую даже память, все равно нужно указывать СКОЛЬКО ее выделять. Как сделать глубину произвольную - запутался... :(

 

Подскажите please как это обычно делается!

 

Заранее спасибо!!!!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите please как это обычно делается!

Память, виртуальна. Физически она появляется только когда происходит запись в нее.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Память, виртуальна. Физически она появляется только когда происходит запись в нее.

 

ну например вызвали функцию push, выделили память new(1).

и так каждый раз? непонятно тогда как хранить указатели...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну например вызвали функцию push, выделили память new(1).

и так каждый раз? непонятно тогда как хранить указатели...

Нет. Я имею в виду что malloc память физически не выделяет. А если вы хотите с указателями, то есть двунаправленные списки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет. Я имею в виду что malloc память физически не выделяет. А если вы хотите с указателями, то есть двунаправленные списки.

 

Вы уж очень философски относитесь к понятию "выделяет". Так можно дойти до того, что ее "выделяет" начальник отдела снабжения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

список что-ли нужен?

Ну откуда я знаю? Я что, телепат? Или хотя бы шизофреник?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну например вызвали функцию push, выделили память new(1).

и так каждый раз? непонятно тогда как хранить указатели...

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

прошу прощения за невнятность, наверно я действительно так выражаюсь.

 

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

вот момент, который остается туманным:

 

кладем в стек 1 число: a=new int(1); a=value;

кладем в стек еще 1 число: b=new int(1); b=value;

 

как можно организовать хранение неопределенного числа переменных a,b,... ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

прошу прощения за невнятность, наверно я действительно так выражаюсь.

 

Для начала, к примеру, вам сюда: http://www.dreamincode.net/forums/topic/10...-in-c-tutorial/

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

в c++ есть такая штука - vector, может быть об этом речь?

или надо самому реализацию стека сделать? тогда через односвязный список

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вовсе не обязательно!

Намек понятен, тока realloc() не во всех реализациях stdlib имеется. Надо-бы топикстартеру платформу и ОС уточнить :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Намек понятен, тока realloc() не во всех реализациях stdlib имеется. Надо-бы топикстартеру платформу и ОС уточнить :)

 

А на кой в стеке realloc?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А на кой в стеке realloc?

Нужно выделить память под хранение данных стека.

Первый раз понятно - malloc().

Далее надо добавить в стек данных, для чего нужно увеличить "вместилище" стека. Как - realloc() подходит идеально.

А без realloc() - связаный список указателей.

Что-нить типа

static int *stack_mem = NULL;
static unsigned int stack_pointer = 0;
int* stack_push(int data)
{
 stack_mem=(int* )realloc(stack_mem, (stack_pointer+1)*sizeof(int));
 if(stack_mem==NULL) return NULL; //out of mem
 stack_mem[stack_pointer++] = data;
 return (stack_mem + stack_pointer - 1);
}
int* stack_pop(int* data)
{
   if(stack_pointer)
   {
*data = stack_mem[--stack_pointer];
return (stack_mem + stack_pointer); 
   }  
   return NULL; //no data in stack
}

 

PS: Код есс-но надо доработать, я его за 10 сек "на коленке" набросал, чтоб идею пояснить :)

Изменено пользователем nk@

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...