Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Класс Stack

Автор: zloy_pes 19.10.2006 22:43

Помогите пожалуйста - нужно на С создать класс стек (stack), в нем реализовать процедуру push (поместить этемент в конец цепочки) и создать конструктор копирования и деструктор. Нужно использовать динамическую память. Элементы стека - double (хотя это наверно не важно).
Заранее спасибо.

Автор: klem4 19.10.2006 23:06

В языке Си классов нет. Си - не объектно-ориентированный язык. Может Си++ ?

Автор: zloy_pes 19.10.2006 23:20

Да, извиняюсь - ошибся С++.

Автор: volvo 19.10.2006 23:27

#include <iostream.h>

typedef double T;

class Stack {

public:
// Конструктор копирования
Stack(const Stack &s);

// Конструктор по умолчанию
Stack(): first(0) {
}

// Деструктор
~Stack();

void push(T value);
void print();

class Item {
public:
Item(T val, Item *next_ptr):
item(val), next(next_ptr) {
};

T item;
Item *next;
};

private:
Item *first;
};

Stack :: Stack(const Stack &s) {

Stack Ts;
for(Item *pt = s.first; pt; pt = pt -> next) Ts.push(pt -> item);
pt = Ts.first;
while(pt) {
push(pt -> item); pt = pt -> next;
}

}


Stack :: ~Stack() {
for(Item *pt = first; pt; ) {
Item *p = pt;
pt = pt -> next;
delete p;
}

first = 0;
}

void Stack :: push(T value) {
Item *pt = new Item(value, first);

first = pt;
}

void Stack :: print() {

cout << "< ";
for(Item *pt = first; pt; pt = pt -> next)
cout << pt -> item << " ";
cout << " >" << endl;
}

int main() {
// Пустой стек
Stack s;

cout << "starting..." << endl;
for(int i = 3; i < 10; ++i)
s.push((double)i);

// Проверяем, что записалось
s.print();

// Копируем s -> s2
Stack s2 = s;
s2.print();

// Деструктор вызовется автоматически
return 0;
}

Так пойдет? (не проверял, но причин для отказа работать не вижу)

Автор: zloy_pes 19.10.2006 23:40

Да, то что надо, Спасибо.