Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Аватара для ganselo

Старожил


Сообщения: 232
Благодарности: 90

Профиль | Сайт | Отправить PM | Цитировать


Вот реализация стека. Писал на 1 курсе... (задание было такое. Реальзовать стек на базе списка. С помощью этого стека реализовать Т-образный перекрёсток для отсеевания поездов). Код "грубый"..
Код: Выделить весь код
#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED
#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;


class node
{
    friend class stack;
    public:
        node(const int &data = 0) : d(data), nextPtr(NULL){}
        int getData() const { return d; }
        node *getNextNode() const { return nextPtr; }
	private:
        node *nextPtr;
        int d;
};


class stack
{
    public:
        stack() : top(NULL){}
        ~stack();
        void inserRand(const int size);
        void insertKeyboard(const int size);
        void insertFile(const char *path);
        void insert(const int &data);
        bool empty() const { return top == 0; }
        void sort();
        void razdelit(const int val);
        void proverka();
        node *getTopNode() const{ return top; }
    private:
        node *top;
        node *getNewNode(const int &data);
	friend ostream& operator <<(ostream &out, stack &print);
	friend stack& operator +(stack &one, stack &two);
};

ostream& operator <<(ostream &out, stack &print)
{
	node *currentPtr = print.top;
	while(currentPtr != NULL)
	{
		out << currentPtr->getData() << " ";
		currentPtr = currentPtr->getNextNode();
	}
return out;
}

stack& operator +(stack &one, stack &two)
{
	stack *out = new stack;
	if(!two.empty())
	{
		stack *twoTemp = new stack;
		node *temp = two.getTopNode();
		while(temp != NULL)
		{
			twoTemp->insert(temp->getData());
			temp = temp->getNextNode();
		}
		temp = twoTemp->getTopNode();
		while(temp != NULL)
		{
			out->insert(temp->getData());
			temp = temp->getNextNode();
		}
		delete twoTemp;
	}
	if(!one.empty())
	{
		stack *oneTemp = new stack;
		node *temp = one.getTopNode();
		while(temp != NULL)
		{
			oneTemp->insert(temp->getData());
			temp = temp->getNextNode();
		}
		temp = oneTemp->getTopNode();
		while(temp != NULL)
		{
			out->insert(temp->getData());
			temp = temp->getNextNode();
		}
		delete oneTemp;
	}
return *out;
}

stack::~stack()
{
    if(!empty())
    {
        node *tempPtr, *currentPtr = top;
        while(currentPtr != NULL)
        {
            tempPtr = currentPtr;
            currentPtr = currentPtr->nextPtr;
            delete tempPtr;
        }
    }
}

void stack::insert(const int &data)
{
    node *newNode = getNewNode(data);
    if(empty())
    {
        top = newNode;
    }
    else
    {
        newNode->nextPtr = top;
        top = newNode;
    }
}

node *stack::getNewNode(const int &data)
{
    node *newNode = new node(data);
    if(newNode != NULL)
        return newNode;
    else
        cerr << "Error. No memory available" << endl << endl;
return NULL;
}

void stack::sort()
{
    stack *one = new stack;
    stack *two = new stack;
    node *currentPtr = top;
    while(currentPtr != NULL)
    {
        if(currentPtr->getData() == 0) one->insert(0);
        else two->insert(currentPtr->getData());
        currentPtr = currentPtr->nextPtr;
    }
    cout << endl << endl;
    cout << *one;
    cout << endl << endl;
    cout << *two;
}

void stack::inserRand(const int size)
{
    srand(time(NULL));
    for(int i = 0; i < size; i++)
        this->insert(rand()%2);
}

void stack::insertKeyboard(const int size)
{
	int data;
	for(int i = 0; i < size; i++)
	{
		cin >> data;
		this->insert(data);
	}
}

void stack::insertFile(const char *path)
{
	ifstream file(path, ios::in);
	if(!file) cerr << "Error. File is not found." << endl;
	else
	{
		int data;
		while(!file.eof())
		{
			file >> data;
			this->insert(data);
		}
	}
}

void stack::razdelit(const int val)
{
	int proverka = 0;
	stack *one = new stack;
	stack *two = new stack;
	stack *oneTemp = new stack;
	stack *twoTemp = new stack;
	node *temp = this->getTopNode();
	while(temp != NULL)
	{
		temp = temp->getNextNode();
		proverka++;
	}
	temp = this->getTopNode();
	for(int i = 0; i < val; i++)
	{
		one->insert(temp->getData());
		temp = temp->getNextNode();
	}
	for(int i = val; i < proverka; i++)
	{
		two->insert(temp->getData());
		temp = temp->getNextNode();
	}
	temp = one->getTopNode();
	while(temp != NULL)
	{
		oneTemp->insert(temp->getData());
		temp = temp->getNextNode();
	}
	temp = two->getTopNode();
	while(temp != NULL)
	{
		twoTemp->insert(temp->getData());
		temp = temp->getNextNode();
	}
	cout << endl << "1: " << *oneTemp << endl;
	cout << "2: " << *twoTemp << endl;
	delete one, two, oneTemp, twoTemp;
}

void stack::proverka()
{
	node *temp = this->getTopNode();
	int proverk = 0;
	while(temp != NULL)
	{
		temp = temp->getNextNode();
		proverk ++;
	}
	if(proverk >= 30)
	{
		this->razdelit(proverk/2);
	}
}
#endif // STACK_H_INCLUDED
А вообще советую открыть (если нету то в гугле: скачать книгу "Как программировать на C++" Авторы Харви Дейтел & Пол Дейтел) книгу "Как программировать на C++". Там все виды динамических структур данных.

-------
К величайшему сожалению "история учит нас тому, что она ничему не учит".

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:43, 19-06-2009 | #2