Форум программистов, компьютерный форум CyberForum.ru

Стеки - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.76
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
03.11.2012, 15:15     Стеки #1
Реализовать программу, в которой будут использоваться стеки (магазинный и кольцевой) и очередь. В самих программах реализовать такие функции:
заполнение стека(очереди) вручную, удаление и добавление элементов, вывод содержимого на экран, очистка стека (очереди).
Смотрел и читал на форуме о стеках но не понял на чем их применять или они сами по себе?
Можете на коде объяснить своими словами как работает стек?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2012, 15:15     Стеки
Посмотрите здесь:

C++ Стеки
Стеки C++
Стеки C++
C++ Стеки
C++ Стеки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BuPy7
Нет ТЗ - давай досвидания
 Аватар для BuPy7
747 / 344 / 30
Регистрация: 01.12.2011
Сообщений: 2,027
03.11.2012, 15:22     Стеки #2
Стек - это, такая фигня, в которую первым вошёл, но последним вышел. Т.е. записали мы в него 5 чисел: 1, 2, 3, 4, 5. И нам нужно прочитать 3 элемент. Для этого мы сначала прочитаем цифру 5, потом 4, а потом уже 3.

Очередь - это, такая фигня, где данные записываются всегда в конец очереди, а считываются с начала.
Т.е. записали мы в очередь 5 чисел: 1, 2, 3, 4, 5. Решили записать ещё цифру 6. Очередь после этой операции приобретёт вид 1, 2, 3, 4, 5, 6.
Решили считать 4 элемент из очереди. Сначала считаем цифру 1, потом 2, потом 3, а потом 4.
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
03.11.2012, 15:31  [ТС]     Стеки #3
Ну на словах все понятно но как эт все написать, то есть самому вводить заполнение стека(очереди) вручную, удаление и добавление элементов, вывод содержимого на экран, очистка стека (очереди).
Да я смотрел примеры но все ровно не получается.
Ilyawow
24 / 24 / 5
Регистрация: 18.11.2011
Сообщений: 266
03.11.2012, 15:44     Стеки #4
Цитата Сообщение от Liberation Посмотреть сообщение
Ну на словах все понятно но как эт все написать, то есть самому вводить заполнение стека(очереди) вручную, удаление и добавление элементов, вывод содержимого на экран, очистка стека (очереди).
а что тут сложного просто структуру объявляеш ьи с ней работаешь
BuPy7
Нет ТЗ - давай досвидания
 Аватар для BuPy7
747 / 344 / 30
Регистрация: 01.12.2011
Сообщений: 2,027
03.11.2012, 15:52     Стеки #5
Самое простое сделать стек с использованием массива. Как разберёшься, то можно будет попробовать написать стек с использованием односвязных\двусвязных списков.
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
03.11.2012, 15:58  [ТС]     Стеки #6
Еще вопрос, магазинный это очередь, а кольцевой это двусвязный?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11817 / 6796 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
03.11.2012, 16:04     Стеки #7
Цитата Сообщение от Liberation Посмотреть сообщение
а кольцевой это двусвязный?
Это где начальный элемент списка, связан с последним.
BuPy7
Нет ТЗ - давай досвидания
 Аватар для BuPy7
747 / 344 / 30
Регистрация: 01.12.2011
Сообщений: 2,027
03.11.2012, 16:06     Стеки #8
Кольцевой это когда дошёл до начала, а следующий элемент последний. Зацикливание.

Магазинный от слова "магазин" от автомата или пулемёта. Думаю, представляете себе, как там патроны вылетают
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
03.11.2012, 16:40     Стеки #9
вот простая очередь, не шаблонная, делал давно посмотрите если что спрашивайте тут форум добрых людей)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#pragma once
#include <iostream>
using namespace std;
 
class NodeQueue
{
private:
    int lenght;
    struct Node
    {
        char data[256];
        Node* next;
    };
    
    Node* head;
    Node* tail;
public:
    explicit  NodeQueue()
    {
        head = NULL;
        tail = NULL;
        lenght = 0;
    }
    /*NodeQueue(const char &s)
    {
    }*/
    ~NodeQueue()
    {
        while(head)
        {
            tail = head->next;
            delete head;
            head = tail;
        }
    }
    void enqueue(void)
    {
        Node* temp = new Node;
        fflush(stdin);
        printf("Insert queue element: ");                /*temp->data = value;*/
        fgets(temp->data, 256, stdin);
        temp->data[strlen(temp->data) - 1] = '\0';
        
        if(empty())
        {
            head = temp;
            tail = temp;
            lenght++;
            cout<<"Element: \""<<temp->data<<"\" has been added to queue."<<endl;
            return;
        }
        tail->next = temp;
        tail = temp;
        tail->next = NULL;
        cout<<"Element: \""<<temp->data<<"\" has been added to queue."<<endl;
        lenght++;
    }
    void dequeue(void)
    {
        if(empty())
        {
            cout<<"Queue is empty"<<endl;
            return;
        }
        Node* delPtr = head;
        cout<<"Element \""<<head->data<<"\" is deleted from queue"<<endl;
        head = head->next;
        delete delPtr;
        lenght--;
    }
    bool empty()const
    {
        return head == NULL;
    }
    inline int getLenght(void)
    {
        return lenght;
    }
    void clean(void)
    {
        if(empty())
        {
            cout<<" Queue is empty."<<endl;
            return;
        }
        Node* delPtr = head;
        if(head != tail)
        {
            while(head)
            {
                head = head->next;
                delete delPtr;
                delPtr = head;
            }
        }
        head = NULL;
        tail = NULL;
        cout<<" All elements of queue is deleted."<<endl;
        lenght = 0;
    }
    void print(void)const
    {
        if(empty())
        {
            cout<<"Queue is empty"<<endl;
            return;
        }
        
        cout<<"________________________________________________________________________"<<endl;
        if(head == tail)
        {
            cout<<head->data<<endl;
        }
        if(head != tail)
        {
            for(Node* ptr = head; ptr != NULL; ptr = ptr->next)
            {
                    cout<<" "<<ptr->data<<" |";
            }
        }
        cout<<endl;
        cout<<"________________________________________________________________________"<<endl;
        cout<<endl;
    }
    char* operator [](int i)
    {
        if(empty())
        {
            cout<<" Queue is empty"<<endl;
        }
        Node* p = head;
        for(int n = 1; p != tail; p = p->next)
        {
            if(i == n)
            {
                return p->data;
            }
            n++;
        }
    }
    friend int clacCount(void)
    {
        int len = 0;
        return len;
    }
};
Добавлено через 20 минут
вот еще стек, не круговой, но думаю превратить в такой не составит труда?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#pragma once
#include <iostream>
using namespace std;
template<class NODETYPE>
class Stack
{
protected:
    int count;//кількість
    struct Node//структура вузол
    {
        NODETYPE data;//дані шаблонного типу
        Node* prev;//покажчик на попередній елемент
        NODETYPE& getData(void)//функція що повертає сслику на дані
        {
            return data;// повертаємо дані
        }
    };
    Node* bottom;//покажчик на вершину стеку
public:
    Stack(void):count(0), bottom(0)//облнуляємо змінні в констукторі
    {
    }
    ~Stack(void)//дестуктор
    {
        clear();//викликаємо функцію очищення
    }
    
    void push(NODETYPE someData)//функція яка добаляє елемент на вершину стеку, приймає на вхід дані
    {
        Node* Temp = new Node;//створюємо новий елемент
        Temp->data = someData;//заповнюємо його дані вхідними даними
        Temp->prev = bottom;//вказуємо що вершина знаходиться перед ним
        bottom = Temp;//тепер вершина і є він
        count++;//інкрементуємо лічильник
    }
    void pop(void)//функція видалення елементу з вершини
    {
        if(!bottom)//у разі коли вершини не існує
        {
            cout<<"Err. Stack is empty."<<endl;//виводимо на екран помилку
            return;//виходимо з функції, не повертаючи значення
        }
        Node* pTemp = bottom->prev;//створюємо новий елемент який зберігає в собі елемент на рівень нижчий вершини
        delete bottom;//видаляємо вершину
        bottom = pTemp;//нова вершина рівна тому елементу
        count--;//декрементуємо лічильник
    }
    void clear(void)//функція очищення
    {
        while(bottom)//циклічно виконуємо доки існую вершина
        {
            Node* delPtr = bottom->prev;//створюємо новий елемент який зберігає в собі елемент на рівень нижчий вершини
            delete bottom;//видаляємо вершину
            bottom = delPtr;//нова вершина рівна тому елементу
        }
        count = 0;//обнуляємо лічильник
        bottom = NULL;//обнуляємо вершину
    }
    NODETYPE getBottomData(void)const//функція що повертає дані з вершини
    {
        return bottom->data;//повертаємо дані вершини
    }
    int rCount(void)const//функція що повертає кількість елементів
    {
        return count;//повертаємо лічильник(поточна кількість)
    }
    friend ostream& operator<<(ostream &o, const Stack &obj)//оператор запису в поток
    {
        if(!obj.bottom)//у разі коли обєкту не існує
        {
            o<<"Err. Stack is empty."<<endl;//записуємо в поток меседж про помилку
            return o;//повертаємо ссилку на поток для того щоб можна було робити так cout<<stack<<"lolwto?";
        }
        o<<"\n";//записуємо в поток перехід на новий рядок
        Node* p = obj.bottom;//створюємо новий покажик який зберігає в собі вершину переданого в оператор обєкту
        for(; p; p = p->prev)//циклічно перебраємо всі елементи покажчика
        {
            o<<" * "<<p->data<<" * "<<endl;//записуючи в поток виведення дані з зірочками по сторонам і переходами на новий рядок
        }
        o<<endl;//перехід на новий рядок
        return o;
    }
    friend istream& operator>>(istream &i, Stack &obj)//оператор зчитування з потоку
    {
        Node* b = obj.bottom;//створюємо новий покажик який зберігає в собі вершину переданого в оператор обєкту
        for(; obj.bottom; obj.bottom = obj.bottom->prev)//циклічно перебраємо всі елементи об'єкту
        {
            cout<<"Insert stack data: ";//виводимо на екран "введіть дані"
            i>>obj.bottom->getData();//зчитуємо  потоку дані записуючи їх в дані елементу стеку
        }
        obj.bottom = b;//відновлюємо покажчик на голову
        return i;//повертаємо ссилку на поток
    }
};
все делалось давно так что кто найдет ошибки буду рад, стек шаблонный, и да надеюсь укр комменты не будут дискриминироваться)
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
03.11.2012, 18:03  [ТС]     Стеки #10
спасибо, правда так много команд и все сразу, а мы не учили в универе стеки и тут все свалилось на голову) буду сидеть вникать, если что напишу)
BuPy7
Нет ТЗ - давай досвидания
 Аватар для BuPy7
747 / 344 / 30
Регистрация: 01.12.2011
Сообщений: 2,027
03.11.2012, 18:31     Стеки #11
Liberation, в универе не учат каким-то предметам, а дают некий "быстрый старт" для постижения.
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
03.11.2012, 20:22  [ТС]     Стеки #12
1>------ Построение начато: проект: ko, Конфигурация: Debug Win32 ------
1>MSVCRTD.lib(crtexe.obj) : error LNK2019: ссылка на неразрешенный внешний символ _main в функции ___tmainCRTStartup
1>c:\users\ganibal012\documents\visual studio 2010\Projects\ko\Debug\ko.exe : fatal error LNK1120: 1 неразрешенных внешних элементов
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

первый пример ошибку выдает
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
04.11.2012, 01:00     Стеки #13
Дайте код мейна плз, без кода ответ маловероятен) ну и вот мелкий примерчик)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include "queue.h"
#include <conio.h>
 
void menu(void)
{
    cout<<"__________________________________________________________________"<<endl;
    cout<<"__________________________________________________________________"<<endl;
    cout<<"                          Varinat 4    "<<endl;
    cout<<"  1 - add element to queue;    2 - delete element from queue; "<<endl;
    cout<<"  3 - print queue elements;    4 - delete all queue elements;"<<endl;
    cout<<"  5 - get lenght of queue;     6 - get element by number;"<<endl;
    cout<<"                Esc - Exit from programm."<<endl;
    cout<<"__________________________________________________________________"<<endl;
    cout<<"__________________________________________________________________"<<endl;
    cout<<endl;
}
void main()
{
    NodeQueue queue;
    /*int leng = queue.lenght();*/
    char key_moment = 0;
mainloop:
    while(key_moment != 27)
    {
        menu();
        key_moment = _getch();
        switch(key_moment)
        {
        case '1':
            {
                queue.enqueue();
                break;
            }
        case '2':
            {
                queue.dequeue();
                break;
            }
        case '3':
            {
                queue.print();
                break;
            }
        case '4':
            {
                queue.clean();
                break;
            }
        case '5':
            {
                cout<<"The lenght of queue is: "<<queue.getLenght()<<endl;
                break;
            }
        case '6':
            {
                int num;
                cout<<" Insert number of element: ";
                cin>>num;
                cout<<"\n Value is \""<<queue[num]<<"\""<<endl;
                break;
            }
        default:
            {
                cout<<" Wron key."<<endl;
            }
        }
    }
    return;
}
Добавлено через 5 минут
проверил у мя все работает, дайте свой код разберемся, к тому же в тексте ошибки явно сказано что проблема в мейе).
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
04.11.2012, 01:16  [ТС]     Стеки #14
неее Вы меня не так поняли, я пробовал ваш запустить и эта ошибка вышла, а потом понял что там нету точки входа то есть мейна)

Добавлено через 4 минуты
ого у вас програмка вышла) где Вы этому научились расскажите мне если не секрет)

Добавлено через 6 минут
почитал ваш код раз 20 чучуть понял но не все
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
04.11.2012, 01:53     Стеки #15
Ну код довольно таки прост, и много чего не хватает еще, например побольше проверок и исключительных ситуаций. Учил на первом курсе, но того что давали преподаватели было мало, далее книга по С, пожже С++, чтот вроде для чайников. Позже пошел Страуступ, еще много книг и статьей которые не запомнились, в данный момент остановился на С++ for real Programmists просто великолепная книга, хоть и трудная но великолепна, для тех кто делает что то вроде буста или кюти очень даже супер, много интересного о правильном стиле да и читается оч приятно с перерывами. Вам же советую просто искать и запоминать, модифицыровать, развиваться и все у вас получиться. Удачи, если что обращайтесь)
Герц
04.11.2012, 12:37
  #16

Не по теме:

а мы не учили в универе стеки и тут все свалилось на голову)
Если ты будешь рассчитывать на то, что тебя в универе чему-то обучат, то ничего не достигнешь. Нужно самому учиться.

Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
04.11.2012, 15:12  [ТС]     Стеки #17
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#pragma once
#include <iostream>
using namespace std;
 
class Stack
{
private:
    int count;//кількість
    struct Node//структура вузол
    {
        char data;//дані шаблонного типу
        Node* prev;//покажчик на попередній елемент
        char& getData(void)//функція що повертає сслику на дані
        {
            return data;// повертаємо дані
        }
    };
    Node* bottom;//покажчик на вершину стеку
public:
    Stack(void):count(0), bottom(0)//облнуляємо змінні в констукторі
    {
    }
    ~Stack(void)//дестуктор
    {
        clear();//викликаємо функцію очищення
    }
    
    void push(char elem)//функція яка добаляє елемент на вершину стеку, приймає на вхід дані
    {
        Node* Temp = new Node;//створюємо новий елемент
        Temp->data = elem;//заповнюємо його дані вхідними даними
        Temp->prev = bottom;//вказуємо що вершина знаходиться перед ним
        bottom = Temp;//тепер вершина і є він
        count++;//інкрементуємо лічильник
    }
    void pop(void)//функція видалення елементу з вершини
    {
        if(!bottom)//у разі коли вершини не існує
        {
            cout<<"Err. Stack is empty."<<endl;//виводимо на екран помилку
            return;//виходимо з функції, не повертаючи значення
        }
        Node* pTemp = bottom->prev;//створюємо новий елемент який зберігає в собі елемент на рівень нижчий вершини
        delete bottom;//видаляємо вершину
        bottom = pTemp;//нова вершина рівна тому елементу
        count--;//декрементуємо лічильник
    }
    void clear(void)//функція очищення
    {
        while(bottom)//циклічно виконуємо доки існую вершина
        {
            Node* delPtr = bottom->prev;//створюємо новий елемент який зберігає в собі елемент на рівень нижчий вершини
            delete bottom;//видаляємо вершину
            bottom = delPtr;//нова вершина рівна тому елементу
        }
        count = 0;//обнуляємо лічильник
        bottom = NULL;//обнуляємо вершину
    }
    char getBottomData(void)const//функція що повертає дані з вершини
    {
        return bottom->data;//повертаємо дані вершини
    }
    int rCount(void)const//функція що повертає кількість елементів
    {
        return count;//повертаємо лічильник(поточна кількість)
    }
    friend ostream& operator<<(ostream &o, const Stack &obj)//оператор запису в поток
    {
        if(!obj.bottom)//у разі коли обєкту не існує
        {
            o<<"Err. Stack is empty."<<endl;//записуємо в поток меседж про помилку
            return o;//повертаємо ссилку на поток для того щоб можна було робити так cout<<stack<<"lolwto?";
        }
        o<<"\n";//записуємо в поток перехід на новий рядок
        Node* p = obj.bottom;//створюємо новий покажик який зберігає в собі вершину переданого в оператор обєкту
        for(; p; p = p->prev)//циклічно перебраємо всі елементи покажчика
        {
            o<<" * "<<p->data<<" * "<<endl;//записуючи в поток виведення дані з зірочками по сторонам і переходами на новий рядок
        }
        o<<endl;//перехід на новий рядок
        return o;
    }
    friend istream& operator>>(istream &i, Stack &obj)//оператор зчитування з потоку
    {
        Node* b = obj.bottom;//створюємо новий покажик який зберігає в собі вершину переданого в оператор обєкту
        for(; obj.bottom; obj.bottom = obj.bottom->prev)//циклічно перебраємо всі елементи об'єкту
        {
            cout<<"Insert stack data: ";//виводимо на екран "введіть дані"
            i>>obj.bottom->getData();//зчитуємо  потоку дані записуючи їх в дані елементу стеку
        }
        obj.bottom = b;//відновлюємо покажчик на голову
        return i;//повертаємо ссилку на поток
    }
};
почему в строчках
C++
1
 Node* p = obj.bottom;//створюємо новий покажик який зберігає в собі вершину переданого в оператор обєкту
C++
1
Node* b = obj.bottom;//створюємо новий покажик який зберігає в собі вершину переданого в оператор обєкту
не определяется Node* ?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.11.2012, 15:37     Стеки #18

Не по теме:

Ужасные комментарии в коде.


Что именно вас смущает? Тип Node*? Это указатель на Node. Или то, что не идёт отдельно
Node *a;
a = obj.bottom;
?
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
04.11.2012, 16:42  [ТС]     Стеки #19
Я имел в виду что указатель Node* не определяется, то есть сначала все нормально,а в строчках что выше написал, пишет что Node* не определен.

Добавлено через 17 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#pragma once
#include <iostream>
using namespace std;
 
class Stack
{
private:
    int count;//кількість
    struct Node//структура вузол
    {
        char data;//дані шаблонного типу
        Node* prev;//покажчик на попередній елемент
        char& getData(void)//функція що повертає сслику на дані
        {
            return data;// повертаємо дані
        }
    };
    Node* bottom;//покажчик на вершину стеку
public:
    Stack(void):count(0), bottom(0)//облнуляємо змінні в констукторі
    {
    }
    ~Stack(void)//дестуктор
    {
        clear();//викликаємо функцію очищення
    }
    
    void push(void)//функція яка добаляє елемент на вершину стеку, приймає на вхід дані
    {
        Node* Temp = new Node;//створюємо новий елемент
        fflush(stdin);
        printf("Insert queue element: ");                /*temp->data = value;*/
 
        if(!bottom)
        {
        bottom = Temp;
        count++;//інкрементуємо лічильник
        cout<<"Element: \""<<Temp->data<<"\" has been added to bottom."<<endl;
        return;
        }
        Temp->prev = bottom;//вказуємо що вершина знаходиться перед ним
        bottom = Temp;
        cout<<"Element: \""<<Temp->data<<"\" has been added to bottom."<<endl;
        count++;
    }
    void pop(void)//функція видалення елементу з вершини
    {
        if(!bottom)//у разі коли вершини не існує
        {
            cout<<"Err. Stack is empty."<<endl;//виводимо на екран помилку
            return;//виходимо з функції, не повертаючи значення
        }
        Node* pTemp = bottom->prev;//створюємо новий елемент який зберігає в собі елемент на рівень нижчий вершини
        delete bottom;//видаляємо вершину
        cout<<"Element \""<<bottom->data<<"\" is deleted from bottom"<<endl;
        bottom = pTemp;//нова вершина рівна тому елементу
        count--;//декрементуємо лічильник
    }
    void clear(void)//функція очищення
    {
        while(bottom)//циклічно виконуємо доки існую вершина
        {
            Node* delPtr = bottom->prev;//створюємо новий елемент який зберігає в собі елемент на рівень нижчий вершини
            delete bottom;//видаляємо вершину
            bottom = delPtr;//нова вершина рівна тому елементу
        }
        count = 0;//обнуляємо лічильник
        bottom = NULL;//обнуляємо вершину
        cout<<" All elements of queue is deleted."<<endl;
    }
    char getBottomData(void)const//функція що повертає дані з вершини
    {
        return bottom->data;//повертаємо дані вершини
    }
    int rCount(void)const//функція що повертає кількість елементів
    {
        return count;//повертаємо лічильник(поточна кількість)
    }
    friend ostream& operator<<(ostream &o, const Stack &obj)//оператор запису в поток
    {
 
        if(!obj.bottom)//у разі коли обєкту не існує
        {
            o<<"Err. Stack is empty."<<endl;//записуємо в поток меседж про помилку
            return o;//повертаємо ссилку на поток для того щоб можна було робити так cout<<stack<<"lolwto?";
        }
        o<<"\n";//записуємо в поток перехід на новий рядок
        Node* p = obj.bottom;//створюємо новий покажик який зберігає в собі вершину переданого в оператор обєкту
        for(; p; p = p->prev)//циклічно перебраємо всі елементи покажчика
        {
            o<<" * "<<p->data<<" * "<<endl;//записуючи в поток виведення дані з зірочками по сторонам і переходами на новий рядок
        }
        o<<endl;//перехід на новий рядок
        return o;
    }
    friend istream& operator>>(istream &i, Stack &obj)//оператор зчитування з потоку
    {
        Node* b = obj.bottom;//створюємо новий покажик який зберігає в собі вершину переданого в оператор обєкту
        for(; obj.bottom; obj.bottom = obj.bottom->prev)//циклічно перебраємо всі елементи об'єкту
        {
            cout<<"Insert stack data: ";//виводимо на екран "введіть дані"
            i>>obj.bottom->getData();//зчитуємо  потоку дані записуючи їх в дані елементу стеку
        }
        obj.bottom = b;//відновлюємо покажчик на голову
        return i;//повертаємо ссилку на поток
    }
};
пробовал сделать второй пример похожий на первый но получилась белиберда) что посоветуете?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2012, 16:56     Стеки
Еще ссылки по теме:

Стеки C++
Стеки C++
стеки C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.11.2012, 16:56     Стеки #20
А, тьфу, понял. Stack::Node*, а не просто Node*. Это внутренний класс Stack, так что надо писать квалификатор.
Yandex
Объявления
04.11.2012, 16:56     Стеки
Ответ Создать тему
Опции темы

Текущее время: 08:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru