Jump to content

    
Sign in to follow this  
elusive

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

Recommended Posts

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

 

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

 

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

 

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

 

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

Share this post


Link to post
Share on other sites
Подскажите please как это обычно делается!

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

 

Share this post


Link to post
Share on other sites
Память, виртуальна. Физически она появляется только когда происходит запись в нее.

 

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

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

Share this post


Link to post
Share on other sites
ну например вызвали функцию push, выделили память new(1).

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

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

Share this post


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

 

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

Share this post


Link to post
Share on other sites
ну например вызвали функцию push, выделили память new(1).

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

 

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

Share this post


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

 

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

 

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

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

 

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

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

 

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

Share this post


Link to post
Share on other sites
прошу прощения за невнятность, наверно я действительно так выражаюсь.

 

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

Share this post


Link to post
Share on other sites
в моем задании сказано использовать динамическую память, оператор new, про списки не указывается.

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

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

Share this post


Link to post
Share on other sites
Вовсе не обязательно!

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

Share this post


Link to post
Share on other sites
А на кой в стеке 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 сек "на коленке" набросал, чтоб идею пояснить :)

Edited by nk@

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this