Помощь - Поиск - Пользователи - Календарь
Полная версия: Класс Stack
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Другие языки
zloy_pes
Помогите пожалуйста - нужно на С создать класс стек (stack), в нем реализовать процедуру push (поместить этемент в конец цепочки) и создать конструктор копирования и деструктор. Нужно использовать динамическую память. Элементы стека - double (хотя это наверно не важно).
Заранее спасибо.
klem4
В языке Си классов нет. Си - не объектно-ориентированный язык. Может Си++ ?
zloy_pes
Да, извиняюсь - ошибся С++.
volvo
#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
Да, то что надо, Спасибо.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.