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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2009, 23:06   #1
Верунчик
Новичок
Джуниор
 
Регистрация: 19.10.2009
Сообщений: 1
По умолчанию Стек С++

ПОМОГИТЕ, ПОЖАЙЛУСТА!!!!
мне нужно создать класс для работы со стеом.Элемент стека - символ.
Сформировать 2 стека, содержащие последовательность символов.
Подсчитать общее количество элементов в теках, предусмотреть востановление их исходно расположения...

Помогите, а то лектор полный ХХХХХ (не буду писать плохие слова), а практик требует...я уже 3 лабы сдала, а на этой все--приехали.
Только еще одна просьба: пишите на более понятном языке...)))
Верунчик вне форума Ответить с цитированием
Старый 20.10.2009, 02:37   #2
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

Ну вот тебе класс стека. И маленький пример работы с ним. Хотя конечно стек организовать можно совершенно по разному. Обрати особое внимание на использование функции realloc в realocateIfNeeded. Можно было конечно вместо этого использовать связные списки.
Код:
#include "stdafx.h"
#include "malloc.h"

class Stack
{
private:
	char* _data;
	int _dataSize;
	int _count;
	void realocateIfNeeded(int _countNeeded)
	{
		if (_countNeeded>_dataSize)
		{
			if (_dataSize==0) { _dataSize = 1; }
			while (_dataSize<_countNeeded)
			{
				_dataSize *= 2;
			}
			_data = (char*)realloc(_data,_dataSize*sizeof(char));
		}
		if ((_countNeeded<=(_dataSize/2))&&(_dataSize>0))
		{
			while (((_dataSize/2)>=_countNeeded)&&(_dataSize>0))
			{
				_dataSize /= 2;
			}
			_data = (char*)realloc(_data,_dataSize*sizeof(char));
		}
	}
public:
	Stack()
	{
		_data = NULL;
		_dataSize = 0;
		_count = 0;
	}
	~Stack()
	{
		if (_dataSize!=0)
		{
			free(_data);
		}
	}
	void Push(char Value)
	{
		realocateIfNeeded(_count+1);
		_data[_count] = Value;
		_count++;
	}
	char Pop()
	{
		if (_count==0) { throw; }
		char value = _data[_count-1];
		realocateIfNeeded(_count-1);
		_count--;
		return (value);
	}
	int Count()
	{
		return _count;
	}
};

int main(int argc, char* argv[])
{
// Здесь сделай свой пример работы со стеком

	Stack s;
	s.Push('A');
	s.Push('B');
	s.Push('C');
	s.Push('D');
	printf(" %c  - %u\n",s.Pop(),s.Count());
	s.Push('E');
	printf(" %c  - %u\n",s.Pop(),s.Count());
	printf(" %c  - %u\n",s.Pop(),s.Count());
	printf(" %c  - %u\n",s.Pop(),s.Count());
	printf(" %c  - %u\n",s.Pop(),s.Count());
	printf("     - %u\n",s.Count());
	return 0;
};
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."

Последний раз редактировалось val_nnm; 20.10.2009 в 02:55.
val_nnm вне форума Ответить с цитированием
Старый 20.10.2009, 11:58   #3
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

А если тебе нужнен связный список то вот код
Код:
#include "stdafx.h"
#include "malloc.h"

class LinkedStack
{
private:
	struct StackNode
	{
		char data;
		StackNode* prew;
	};
	int _count;
	StackNode* lastNode;
public:
	LinkedStack()
	{
		_count = 0;
		lastNode = NULL;
	}
	~LinkedStack()
	{
		while (lastNode!=NULL)
		{
			StackNode* node = lastNode;
			lastNode = (*node).prew;
			free(node);
		}
	}
	void Push(char Value)
	{
		StackNode* node = (StackNode*)malloc(sizeof(StackNode));
		(*node).data = Value;
		(*node).prew = lastNode;
		lastNode = node;
		_count++;
	}
	char Pop()
	{
		if (lastNode==NULL) { throw; }
		StackNode* node = lastNode;
		char value = (*node).data;
		lastNode = (*node).prew;
		free(node);
		_count--;
		return (value);
	}
	int Count()
	{
		return _count;
	}
	int CalcCount()	// Данный метот нужен только для примера. Чтобы показать что мы умеем считать
			// количество элементов в списке. Хотя это количество и так правильно записанно
			// в поле _count
	{
		int i = 0;
		StackNode* node = lastNode;
		while (node!=NULL)
		{
			node = (*node).prew;
			i++;
		}
		return (i);
	}
};

int main(int argc, char* argv[])
{
// Здесь сделай свой пример работы со стеком
	LinkedStack s;
	s.Push('A');
	s.Push('B');
	s.Push('C');
	s.Push('D');
	printf(" %c  - ",s.Pop());printf("%u\n",s.Count());
	s.Push('E');
	printf(" %c  - ",s.Pop());printf("%u\n",s.Count());
	printf(" %c  - ",s.Pop());printf("%u\n",s.Count());
	printf(" %c  - ",s.Pop());printf("%u\n",s.Count());
	printf(" %c  - ",s.Pop());printf("%u\n",s.Count());
	printf("    - %u\n",s.Count());
	return 0;
};
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."
val_nnm вне форума Ответить с цитированием
Старый 28.09.2011, 08:39   #4
tiosteel
Новичок
Джуниор
 
Регистрация: 28.09.2011
Сообщений: 1
По умолчанию

Цитата:
Сообщение от val_nnm Посмотреть сообщение
Ну вот тебе класс стека. И маленький пример работы с ним. Хотя конечно стек организовать можно совершенно по разному. Обрати особое внимание на использование функции realloc в realocateIfNeeded. Можно было конечно вместо этого использовать связные списки.
разъясните, пожалуйста, следующее:
можно ли функцию, пересчитывающую выделение памяти реализовать следующим образом? (получил подобное задание, только стеки должны быть с int'ами, дописаны процедуры сортировки и перегружено сложение)
Код:
void realocateIfNeeded(int _countNeeded)
 {
  if (_countNeeded!=_dataSize){_dataSize=_countNeeded; _data=(int*)realloc(_data,_countNeeded*sizeof(int));}
 }
если же подобная реализация бредова - дайте пожалуйста ссылку на документацию по malloc, если не сложно

Последний раз редактировалось tiosteel; 28.09.2011 в 08:42.
tiosteel вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
стек Dimarik Общие вопросы C/C++ 3 28.09.2009 22:14
Стек lucky Паскаль, Turbo Pascal, PascalABC.NET 2 12.05.2009 18:35
стек в PM vladimir0108 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 08.01.2009 01:18
Стек Еленка Помощь студентам 2 06.06.2008 18:58
Стек Foky Паскаль, Turbo Pascal, PascalABC.NET 8 13.05.2008 18:39