Консультация № 137529
19.05.2008, 16:47
0.00 руб.
0 1 1
Здравствуйте!
Помогите, пожалуйста, реализовать шаблон класса Stack. Для представления элемента стека использовать шаблон класса Node. Реализовать как класс контейнера и итератора.

Обсуждение

Неизвестный
20.05.2008, 07:59
общий
это ответ
Здравствуйте, Alenas!
Реализацию класса стека по вашему заданию смотрите в приложении. Также реализован итератор для доступа к элементам. Работа программы представлен в виде консольного меню, позволяющего добавлять/извлекать элементы стека, выводить содержимое стека на экран, а также очищать стек. Компилятор MS VS 2005.

Приложение:
#include <iostream>#include <iomanip>using namespace std;template <class T>class stack {private: struct node { T data; node *next; node(const T& _data) : data(_data) , next(NULL) {} }; node *head; int _size;public: class iterator { friend class stack; node *ptr; public: iterator() : ptr(NULL) {} iterator(node *_ptr) : ptr(_ptr) {} ~iterator() { } iterator& operator ++ () { ptr = ptr->next; return *this; } T& operator * () { return ptr->data; } bool operator == (const iterator& iter) const { return (ptr == iter.ptr); } bool operator != (const iterator& iter) const { return !(*this == iter); } }; stack() : head(NULL) , _size(0) {} ~stack() { clear(); } iterator begin() const { return iterator(head); } iterator end() const { return iterator(); } int size() const { return _size; } bool empty() const { return (_size == 0); } void push(const T& data) { if(head == NULL) { head = new node(data); _size++; return; } node *n = new node(data); n->next = head; head = n; _size++; } T pop() { if(empty()) return T(); T data = head->data; node *n = head->next; delete head; head = n; return data; } T top() { if(empty()) return T(); return *(begin()); } void clear() { node *n = head; head = NULL; node *next; while(n != NULL) { next = n->next; delete n; n = next; } _size = 0; }};int main(int argc, char* argv[]) { stack<int> st; int select = -1; int number; while(select != 0) { system("cls"); cout << "1. Push to stack" << endl; cout << "2. Pop from stack" << endl; cout << "3. Print stack" << endl; cout << "4. Clear stack" << endl; cout << "0. Exit" << endl; cout << "Input your choice..." << endl; cin >> select; switch(select) { case 0: cout << "Exit from program..." << endl; break; case 1: cout << "Input a number: "; cin >> number; st.push(number); break; case 2: if(st.empty()) { cout << "Stack is empty..." << endl; break; } cout << "Popped from stack: " << st.pop() << endl; break; case 3: if(st.empty()) { cout << "Stack is empty..." << endl; break; } cout << "Stack elements:" << endl; for(stack<int>::iterator iter = st.begin(); iter != st.end(); ++iter) cout << setw(3) << *iter; cout << endl; break; case 4: st.clear(); cout << "Stack cleared..." << endl; break; default: cout << "Incorrect input..." << endl; break; } system("pause"); } return 0;}
Форма ответа