Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
#1

Куда помещается элемент в стеке? - C++

09.04.2012, 14:35. Просмотров 734. Ответов 12
Метки нет (Все метки)

В разделе про работу функции сказано, что для этого применяется стек. И всё это описано.
Есть такая фраза, цитирую:
При помещении элемента в стек он размещается на полке, расположенной над вершиной стека, после чего указатель вершины изменяется таким образом, чтобы указывать на новое значение.
Или я не пойму чего-то, или у автора опечатка. Он сам дальше пишет, что указатель указывает на вершину стека, все ячейки ниже это есть элементы в стеке, а все ячейки выше - это вне стека. Значит при записи новый элемент должен помещаться в ячейку, на которую сейчас указывает указатель, то есть в вершину стека, а потом указатель должен подниматься на 1 позицию вверх. А почему он пишет над вершиной? Автор же сам себе противоречит. Не понимаю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2012, 14:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Куда помещается элемент в стеке? (C++):

Найти в стеке самый максимальный элемент и удалить его - C++
Доброго времени суток. У меня, к примеру, есть стек. В нем введено несколько элементов, допустим 4. Как найти в стеке самый максимальный и...

Создать стек из вещественных чисел; найти максимальный элемент в стеке; организовать просмотр данных стека - C++
Создать стек из вещественных чисел. Определить максимальный элемент в стеке. Организовать просмотр данных стека.

Есть 4 потока. После осуществления блокировки барьером, 3 куда-то деваются, куда? (pthreads) - C++
Друзья! Как мог упростил код, вот суть В цикле создаются 4 вспомогательных потока, кадый из которых в цикле же 2 раза выводит свой...

Помещается ли один прямоугольник в другом? - C++
дано дійсні додатні числа a b c d . З’ясувати, чи можна пря- мокутник зі сторонами a b, вмістити всередині прямокутника зі сто- ронами...

Структура в стеке - C++
Я наверное уже всех задолбал со своим стеком, но всё же мне еще нужна помощь)) Код, который ниже должен запрашивать у пользователя ввод...

Вопрос о стеке - C++
На сколько я знаю, подпрограмма которая выполняется рекурсивно, кидает в стек копию своих параметров, и так пока стек не переполнится... ...

12
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
09.04.2012, 14:39 #2
Alex Z, Ну при добавлении элемента элемент сначала размещается над вершиной стека, затем он становится вершиной. Что не ясно?
0
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
09.04.2012, 14:40  [ТС] #3
Цитата Сообщение от ForEveR Посмотреть сообщение
Alex Z, Ну при добавлении элемента элемент сначала размещается над вершиной стека, затем он становится вершиной. Что не ясно?
А сюда нельзя рисунок прикрепить? Словами не объяснить.
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
09.04.2012, 14:44 #4
Alex Z, Хм. Вкратце.

Стек : a b c d.
элемент со значение d - вершина стека.
Мы хотим положить в стек элемент со значением e.
Создали узел. Стек : a b c d. Узел : e.
Добавили наш узел в стек. Стек : a b c d e.
элемент со значением e - вершина стека.
0
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
09.04.2012, 14:52  [ТС] #5
Цитата Сообщение от ForEveR Посмотреть сообщение
Alex Z, Хм. Вкратце.

Стек : a b c d.
элемент со значение d - вершина стека.
Мы хотим положить в стек элемент со значением e.
Создали узел. Стек : a b c d. Узел : e.
Добавили наш узел в стек. Стек : a b c d e.
элемент со значением e - вершина стека.
Как-то не так. Если у нас стек из 4-х элементов: a, b, c, d. То пусть они занимают ячейки в памяти с номерами: 1, 2, 3, 4. Тогда указатель на вершину стека будет смотреть на ячейку 5, но там нет элемента. А если я пихаю туда элемент c, то он по-идее должен попасть именно в вершину стека (то есть в ячейку 5). А потом указатель на вершину смещается и показывает на ячейку 6. Мне показалось так.
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
09.04.2012, 14:54 #6
Alex Z, Нет. Указатель на вершину стека - указывает на элемент находящийся на вершине.
Т.е. Стек : a b c d. Вершина - указатель на элемент d.
0
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
09.04.2012, 14:56  [ТС] #7
Цитата Сообщение от ForEveR Посмотреть сообщение
Alex Z, Нет. Указатель на вершину стека - указывает на элемент находящийся на вершине.
Т.е. Стек : a b c d. Вершина - указатель на элемент d.
А в книге он указывает выше последнего элемента. Значит ошибка в рисунке, а не в тексте.
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
09.04.2012, 14:57 #8
Вы про ассемблер что ли?
Если да, то там элементы заполняются сверху вниз, допустим esp(вершина стека) указывает на участок памяти 0x12345, мы делаем push(добавляем в стек переменную, допустим, 4 байта), адрес становится равным 0x12341.
1
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
09.04.2012, 14:58  [ТС] #9
Цитата Сообщение от diagon Посмотреть сообщение
Вы про ассемблер что ли?
Если да, то там элементы заполняются сверху вниз, допустим esp(вершина стека) указывает на участок памяти 0x12345, мы делаем push(добавляем в стек переменную, допустим, 4 байта), адрес становится равным 0x12341.
Про С++
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
09.04.2012, 14:59 #10
Alex Z, Вообще по сути call-stack реализован либо на С, либо на асме. А вы судя по всему спрашиваете именно про call-stack.
0
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
09.04.2012, 15:01  [ТС] #11
Цитата Сообщение от ForEveR Посмотреть сообщение
Alex Z, Вообще по сути call-stack реализован либо на С, либо на асме. А вы судя по всему спрашиваете именно про call-stack.
Я не знаю. Просто стек. Так написано в книге "Либерти - С++ за 21 день". Стр. 130.
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
09.04.2012, 15:17 #12
Пример.

C++
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
#include <iostream>
 
class Stack
{
public:
   struct Node
   {
      explicit Node(int val = 0, Node* n = 0):
      next(n), value(val)
      {
      }
      typedef int type;
      Node* next;
      type value;
      void trace()
      {
         std::cout << "Current: " << (void*)this
            << " Next: " << (void*)next << std::endl;
      }
   };
public:
   Stack():top(0)
   {
   }
   ~Stack() { clear(); }
   size_t size() const { return sz; }
   void push(const Node::type& value)
   {
      Node* tmp = new Node(value, top);
      tmp->trace();
      top = tmp;
      ++sz;
      top->trace();
   }
   void pop()
   {
      if (top)
      {
         top->trace();
         Node* t = top->next;
         delete top;
         top = t;
         top->trace();
         --sz;
      }
   }
   const Node::type get() const { return top ? top->value : Node::type(); }
   bool empty() const { return sz == 0; }
private:
   Stack(const Stack&);
   Stack& operator =(const Stack&);
   void clear()
   {
      while (!empty())
      {
         pop();
      }
   }
   Node* top;
   size_t sz;
};
 
int main()
{
   Stack st;
   st.push(1);
   st.push(5);
   st.push(3);
   while (!st.empty())
   {
      std::cout << st.get() << std::endl;
      st.pop();
   }
}
http://liveworkspace.org/code/cc7c03...a697e526103d42
1
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
09.04.2012, 15:20 #13
Все там правильно написано.
Допустим, есть стек(заполняется снизу вверх):
a <- вершина стека
b
c
Ложим туда элемент d, получается
d
a <- вершина стека
b
c
Затем изменяем указатель вершины стека, получается
d <- вершина стека
a
b
c
Т.е. вы слишком буквально воспринимаете фразу "вершина стека", в данном случае она обозначает указатель, а вовсе не самый верхний элемент.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2012, 15:20
Привет! Вот еще темы с ответами:

Ошибка в стеке! - C++
template&lt;typename T&gt; class Stack { private: struct Stek { T key; Stek* next; };

Вопрос о стеке в С++ - C++
Всем привет!! У меня тут вопрос про стек. Цитата из книги: Вектор здесь статический, может хранить только элементы типа int....

Динамические массивы на стеке - C++
Почему не придумали ещё язык программирования, который в точности повторял бы С++, но содержал дополнительно всего одну функцию &quot;выделение...

Выполнение кода в стеке - C++
Доброго времени суток! Не могу разобратся в коде void Demo(int (*_printf) (const char *,...) ) { _printf(&quot;Hello, Word!\n&quot;); ...


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

Или воспользуйтесь поиском по форуму:
13
Yandex
Объявления
09.04.2012, 15:20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru