Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2011, 21:58   #1
kei91
 
Аватар для kei91
 
Регистрация: 30.08.2011
Сообщений: 7
По умолчанию Реализация стека

Здравствуйте, знаю, что есть много литературы и примеров кода по этому вопросу, но мне непонятно все же. Дали "шаблон задания", выглядит так
Код:
 class Stack {
 Stack* next;
//...
int value;
};

int main() {
Stack s(10);
s.push(7);
s.push(8);
cout << s.pop();
//...
}
cout << s.pop() - выводит последнее записанное в стек значение, далее надо написать вывод всех значений, записанных в стек. Вот, что попыталась сделать я:

Код:
#include "stdafx.h"
#include <iostream>

using namespace std;

class Stack {
      
public:
 Stack* next;
 int value;

 Stack(int _value) {
  value = _value;
 };

 void push(int _value){
  next = new Stack(_value);
  //next[1].value = _value;
 // free(next); 
 }

int pop() { 
 return next[0].value;

}

 void insert() {
	 cout << Stack::value << endl;
 }

};

int main()
{
	Stack s(10);
	s.push(7); 
	s.push(8);
	s.pop();
	cout << s.pop() << endl;
	s.insert();

}
Что я не понимаю: как реализовать запись всех значений в next, ведь же он получается перезаписывается каждый раз.
Помогите, пожалуйста, разобраться.
kei91 вне форума Ответить с цитированием
Старый 17.11.2011, 22:42   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Это - достаточно нетипичный шаблон для стека, обычно учат хранить связный список внутри объекта. Тут тебе придется извращаться как-то так, например:
Код:
void push(int _value)
{
	Stack* elem = new Stack(value);
	elem->next=next;
	next=elem;
	value=_value;
}
Son Of Pain вне форума Ответить с цитированием
Старый 17.11.2011, 23:51   #3
kei91
 
Аватар для kei91
 
Регистрация: 30.08.2011
Сообщений: 7
По умолчанию

Спасибо большое! Я правильно понимаю, что
Код:
 Stack* elem = new Stack(value);
здесь создается указатель на значение стека (в моем случае сначала оно будет равно 10, так?)
Код:
 elem -> next = next;
вот здесь не очень понимаю, тут получаем доступ к элементу next и присваиваем ему же значение next, но его же у нас нет изначально или я что-то неправильно понимаю?

И ещё вопрос как можно вывести все элементы, содержащиеся у меня в стеке?
Через next[i].value? Или это совсем бред?
kei91 вне форума Ответить с цитированием
Старый 17.11.2011, 23:59   #4
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Мы создаем новый элемент; записываем в него то, что было раньше записано в вершине стека; вместо этого в вершину записываем новое значение; а потом полю next новосозданного элемента присваиваем то, что было в поле next вершины. Проще говоря - вставляем новый элемент в цепочку между вершиной и следующим за ней элементом, если он был. Если его не было - в его поле next просто запишется 0 и ничего страшного не случится

А перебирать элементы проще всего через несколько последовательных вызовов pop (только ее сначала придется написать, да).

А через next[i] обращаться нельзя, это ж единственный указатель )
Son Of Pain вне форума Ответить с цитированием
Старый 18.11.2011, 19:59   #5
kei91
 
Аватар для kei91
 
Регистрация: 30.08.2011
Сообщений: 7
По умолчанию

..., я прошу прощение за свою тупость, но можете ещё объяснить, как вообще происходит запись в стек? Никак я не понимаю, куда вообще записывается что, и как к этой записи обращаться.

Вот у меня изначально создается объект - Stack s(10), значение 10 записывается в value, затем, по методу s.push(7) создается новый элемент и записывается значение 7, опять же в value, но уже нового элемента? Т.е. выделяется ещё одна ячейка памяти под этот элемент? Если да, то как к ней обратиться?

И еще вопрос, вот у меня записано в стеке 10,7,8. Если я пишу Stack::value, он у меня выводит соответственно, последнее записанное значение - 8.
В методе pop() получается я должна вывести, находящееся значение в стеке и удалить это значение, вот это самое 8, и при повторном вызове pop() у меня уже в стеке будет храниться уже предыдущее значение -7. Так?
kei91 вне форума Ответить с цитированием
Старый 18.11.2011, 20:19   #6
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от kei91 Посмотреть сообщение
..., я прошу прощение за свою тупость, но можете ещё объяснить, как вообще происходит запись в стек? Никак я не понимаю, куда вообще записывается что, и как к этой записи обращаться.

Вот у меня изначально создается объект - Stack s(10), значение 10 записывается в value, затем, по методу s.push(7) создается новый элемент и записывается значение 7, опять же в value, но уже нового элемента? Т.е. выделяется ещё одна ячейка памяти под этот элемент? Если да, то как к ней обратиться?

И еще вопрос, вот у меня записано в стеке 10,7,8. Если я пишу Stack::value, он у меня выводит соответственно, последнее записанное значение - 8.
В методе pop() получается я должна вывести, находящееся значение в стеке и удалить это значение, вот это самое 8, и при повторном вызове pop() у меня уже в стеке будет храниться уже предыдущее значение -7. Так?
Вы правильно поняли. У вас есть связный список элементов вашего класса, которые собой имитируют работу стека. У стека есть открытый интерфейс. Это методы push, pop и top. Поэтому если вы хотите обратиться к предыдущему элементу стека, вы должны сначала извлечь из него текущий элемент стека.
То есть операция просмотра стека связана с операцией последовательного удаления из стека элементов. В этом и состоит суть стека.
Но у вас в дизайне вашего стека есть проблема. Когда у вас в стеке один элемент, то не понятно, как его удалить и какое при этом будет состояние стека.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 18.11.2011, 21:04   #7
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Все правильно, да. Только тебе все же придется чуть переделать этот "шаблон" - внести связный список внутрь объекта полностью. Иначе функции push и pop получатся чересчур эзотеричными )

В общем, добавься ко мне в аську, если еще будут вопросы, там удобнее разбираться.
Son Of Pain вне форума Ответить с цитированием
Старый 21.11.2011, 22:53   #8
kei91
 
Аватар для kei91
 
Регистрация: 30.08.2011
Сообщений: 7
По умолчанию

Спасибо, вроде разобралась =), вот, что у меня вышло
Код:
#include "stdafx.h"
#include <iostream>

using namespace std;

class Stack {
      
public:
 
 Stack *next; // указатель на следующий элемент стека
 int value;

 Stack *Head; // верхушка стека

 Stack(int _value) {
  value = _value;
 };



 void push(int _value){
	
	Stack *element = new Stack(value);
	element -> value = _value;
	element -> next = Head; // тащим наверх
	Head = element; // новые значение - на верхушку

 }

int pop() { 
 
	 int element = Head -> value; // берем указатель на 1-ый элемент
	 Head = Head -> next; // верхушка переносится
	 return element;

}


};

int main()
{
	Stack s(10);
	s.push(7); 
	s.push(8);
	cout << s.pop() << endl;
	cout << s.pop() << endl;
//	cout << s.pop() << endl;

}
Но вот есть вопрос как бы записать первое значение s в стек, Stack s(10) - вот из этой строчки?
Пробовала писать Head -> value = _value в конструкторе, выводит ошибку Необработанное исключение в "0x013814fc" в "stack22.exe": 0xC0000005: Нарушение прав доступа при записи "0xccccccd0".
kei91 вне форума Ответить с цитированием
Старый 21.11.2011, 23:21   #9
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Осталось добавить в конструктор строчку
Код:
Head=this;
и оно заработает, в принципе.
Son Of Pain вне форума Ответить с цитированием
Старый 22.11.2011, 00:00   #10
kei91
 
Аватар для kei91
 
Регистрация: 30.08.2011
Сообщений: 7
По умолчанию

Спасибо огромное!!! =)
kei91 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализация стека basilius90 Паскаль, Turbo Pascal, PascalABC.NET 0 03.06.2010 17:01
C++, реализация стека OffyGhost Помощь студентам 2 28.03.2010 07:02
Реализация стека на С Angriff Помощь студентам 14 01.03.2010 10:51
Реализация Стека MjRed Общие вопросы C/C++ 3 13.05.2009 12:18