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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2013, 11:36   #1
Voronar
Пользователь
 
Регистрация: 09.06.2012
Сообщений: 32
По умолчанию Стек с использованием кучи

Решаю задачки по C++ для общего развития. Столкнулся с проблемкой при проектировании класса стек.
Есть класс:
Код:
#ifndef DSTACK_H
#define DSTACK_ H
typedef unsigned long Item;

class DStack
{
private:
	Item * pitems;
	int size;
	int top;
public:
	DStack(int n=10);
	DStack(const DStack & st); //coping constructor
	~DStack();

	bool isempty() const; //methods
	bool isfull() const;
	bool push(const Item & item);
	bool pop(Item & item);
	DStack & operator=(const DStack & st);
};
#endif
А вот его реализация:
Код:
#include "DStack.h"

DStack::DStack(int n)
 {
	 size = n;
	 top = 0;
	 pitems = new Item[size];
 }
DStack::DStack(const DStack & st)
{
	this->top = st.top;
	this->size = st.size;
	pitems = new Item[st.size];
	for(int i = 0 ; i < st.size; i++)
	{
		this->pitems[i] = st.pitems[i];
	}
}
DStack &  DStack::operator=(const DStack & st)
{
	if(this == &st)
	{
		return *this;
	}
	delete[] this->pitems;

	size = st.size;
	pitems = new Item[st.size];
	for(int i = 0 ; i < st.size; i++)
	{
		this->pitems[i] = st.pitems[i];
	}

	return *this;
}
DStack::~DStack()
{
	delete[] pitems;
}
bool DStack::isempty() const
{
	return top==0;
}
bool DStack::isfull() const
{
	return top==size;
}
bool DStack::push(const Item & item)
{
	if(!isfull())
	{
		pitems[top] = item;
		top++;
	}
	else
	{
		return false;
	}

	return true;
}
bool DStack::pop(Item & item)
{
	if(!isempty())
	{
		item = pitems[top];
		top--;
	}
	else
	{
		return false;
	}

	return true;
}
Пример использования:
Код:
#include "DStack.h"
#include <iostream>
using namespace std;

int main()
{
	DStack s1(5);
	DStack s2;
	Item i[5] = {1,2,3,4,5};
	s1.push(i[0]);
	s1.push(i[1]);
	s1.push(i[3]);

	s1.pop(i[5]);
	cout << i[5];
	cin.get();
	return 0;
}
Проблема в том, что я не могу создать массив элементов item. Хотя по идее делаю все правильно... Создаю указатель на нужный тип, выделяю память в куче.
Почему-то, при дебаге обнаруживаю, что мой динамический массив может вместить только один элемент.
Voronar вне форума Ответить с цитированием
Старый 16.01.2013, 11:40   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Почему-то, при дебаге обнаруживаю, что мой динамический массив может вместить только один элемент.
Как именно обнаруживаете? И какого чёрта в программе Вы обращаетесь к i[5]?
Abstraction вне форума Ответить с цитированием
Старый 16.01.2013, 11:49   #3
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Это как всегда погрешность на единицу:
Код:
bool DStack::pop(Item & item)
{
	if(!isempty())
	{

                top--; // воткнуть сюда
		item = pitems[top];
		//top--; // отсюда убрать
	}
	else
	{
		return false;
	}

	return true;
}
ЗЫ.
Или нет?

Последний раз редактировалось EUGY; 16.01.2013 в 11:54.
EUGY вне форума Ответить с цитированием
Старый 16.01.2013, 14:52   #4
Voronar
Пользователь
 
Регистрация: 09.06.2012
Сообщений: 32
По умолчанию

Abstraction
Ставлю точки прерывания и оператор за оператором отслеживаю состояние необходимых мне переменных.
А с индексом 5 я оплошал. Я хотел взять 5 элемент со значением 5. А так как индекс элемента равен значению в этом случае... Мой мозг захотел 5 и я случайно вместо i[4] написал ошибочный вариант.
Voronar вне форума Ответить с цитированием
Старый 16.01.2013, 15:05   #5
Voronar
Пользователь
 
Регистрация: 09.06.2012
Сообщений: 32
По умолчанию

EUGY
Спасибо. Да, погрешность на 1.
Жалко, что в режиме отладки при расстановке точек прерывания я только вижу первый элемент динамического массива pitems, при наведении на него мышью. Скорее всего это из-за того, что это динамический объект данных, а items - указатель на его первый элемент. Или в VS можно просматривать содержимое динамических объектов данных?
Voronar вне форума Ответить с цитированием
Старый 16.01.2013, 15:28   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Или в VS можно просматривать содержимое динамических объектов данных?
Можно, если немного схитрить. В окне Watch наберите pitems[2] - увидите содержимое третьего элемента. Ведь тип переменной pitems - "указатель на Item", про массив (а тем более его длину) нет ни слова - вот студия и не проявляет инициативы.
Abstraction вне форума Ответить с цитированием
Старый 16.01.2013, 15:39   #7
Voronar
Пользователь
 
Регистрация: 09.06.2012
Сообщений: 32
По умолчанию

Abstraction
Проверил - работает. Спасибо.
Voronar вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка КУЧИ!!! bignick Общие вопросы по Java, Java SE, Kotlin 6 11.04.2011 23:08
СТЕК(((Написать с использованием стека((( Sonne_asja Помощь студентам 16 10.04.2011 14:54
Повреждение кучи fosder Помощь студентам 0 08.12.2010 01:36
необходимо сделать стек на указателях с использованием ООП TROXEVASIN Общие вопросы Delphi 14 22.10.2007 23:56