Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22

Ошибка expected type-specifier before 'ptr_head' при реализации стека

23.02.2019, 16:27. Показов 4617. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Третий заход. Как-то пока мне не везёт в C++...

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
#include <iostream>
#include <stdexcept>
 
using namespace std;
 
template<typename T>
class node_t
{
private:
    void init(T value, node_t<T>* ptr_next)
    {
        this.value = value;
        this.ptr_next = ptr_next;
    }
    
public:
    T value;
    node_t<T>* ptr_next;
    
    node_t()
    {
        init(0, NULL);
    }
    
    node_t(T value, node_t<T>* ptr_next)
    {
        init(value, ptr_next);
    }
    
    node_t(const node_t<T>& target)
    {
        init(target->value, target->ptr_next);
    }
    
    ~node_t()
    {
        delete ptr_next;
    }
    
    void print()
    {
        cout << value;
    }
};
 
template<typename T>
class stack_t
{
private:
    node_t<T>* ptr_head;
    int count;
 
    void init()
    {
        ptr_head = NULL;
        count = 0;
    }
 
public:
    int get_count()
    {
        return count;
    }
    
    stack_t()
    {
        init();
    }
    
    void push(T item)
    {
        ptr_head = new ptr_head(item, ptr_head); // <-- Тут expected type-specifier before 'ptr_head'
        count++;
    }
    
    T pop()
    {
        if (count == 0)
            throw out_of_range();
        T resultItem = ptr_head->value;
        ptr_head = ptr_head->next;
        count--;
    }
};
 
int main(int argc, char** argv)
{
}
Почему вылетает ошибка:
[Error] expected type-specifier before 'ptr_head'
? Второй вопрос - как правильно сделать тут удаление узлов?

Не по теме:

Я пишу на C++ 98.

0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.02.2019, 16:27
Ответы с готовыми решениями:

Expected type-specifier
Что нужно исправить в этих классах чтоб все работало? http://************/b6z111 (ошибки) П.5.18 Правил Запрещено размещать задания и...

Ошибка "error C4430: missing type specifier" при работе с fstream
Добрый день. Работаю над сохранением и загрузкой файлов. Для этого использую библиотеку &lt;fstream&gt;, создаю обьект класса fstream....

Ошибка при компиляции под x64: "C++ requires a type specifier for all declarations"
Хочу скомпелировать под 64, создаю тестовый проект (создаю всего одну функцию в отдельном юните). Под 32 все нормально, но вот под 64 на...

17
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
23.02.2019, 16:40
Соколиный глаз, отметил где покопался
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
#include <iostream>
#include <stdexcept>
 
using namespace std;
 
template<typename T>
class node_t
{
private:
    void init(T value, node_t<T>* ptr_next)
    {
        this->value = value; //***
        this->ptr_next = ptr_next; //***
    }
    
public:
    T value;
    node_t<T>* ptr_next;
    
    node_t()
    {
        init(0, NULL);
    }
    
    node_t(T value, node_t<T>* ptr_next)
    {
        init(value, ptr_next);
    }
    
    node_t(const node_t<T>& target)
    {
        init(target->value, target->ptr_next);
    }
    
    ~node_t()
    {
        delete ptr_next;
    }
    
    void print()
    {
        cout << value;
    }
};
 
template<typename T>
class stack_t
{
private:
    node_t<T>* ptr_head;
    int count;
 
    void init()
    {
        ptr_head = NULL;
        count = 0;
    }
 
public:
    int get_count()
    {
        return count;
    }
    
    stack_t()
    {
        init();
    }
    
    void push(T item)
    {
        ptr_head = new node_t<T>(item, ptr_head); // <-- Тут expected type-specifier before 'ptr_head'
        count++;
    }
    
    T pop()
    {
        if (count == 0)
            throw out_of_range("???"); //***
        T resultItem = ptr_head->value;
        ptr_head = ptr_head->next;
        count--;
    }
};
 
int main(int argc, char** argv)
{
    stack_t<int> t;
    t.push(1);
}
Добавлено через 2 минуты
в логику конечно же мне лень вникать

Добавлено через 59 секунд
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Второй вопрос - как правильно сделать тут удаление узлов?
в смысле удаление узла с верхушки стека?
1
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
23.02.2019, 16:53  [ТС]
в смысле удаление узла с верхушки стека?
Не, удаление деструктором объекта node_t<T>.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
23.02.2019, 17:14
Соколиный глаз, твой код в принципе уже может удалять ноды, деструктор рекурсивно будет вызываться, на проверь:
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
#include <iostream>
#include <stdexcept>
 
using namespace std;
 
template<typename T>
class node_t
{
private:
    void init(T value, node_t<T>* ptr_next)
    {
        this->value = value; //***
        this->ptr_next = ptr_next; //***
    }
    
public:
    T value;
    node_t<T>* ptr_next;
    
    node_t()
    {
        init(0, NULL);
    }
    
    node_t(T value, node_t<T>* ptr_next)
    {
        init(value, ptr_next);
    }
    
    node_t(const node_t<T>& target)
    {
        init(target->value, target->ptr_next);
    }
    
    ~node_t()
    {
        std::cout << "~node_t()" << std::endl;
        delete ptr_next;
    }
    
    void print()
    {
        cout << value;
    }
};
 
template<typename T>
class stack_t
{
private:
    node_t<T>* ptr_head;
    int count;
 
    void init()
    {
        ptr_head = NULL;
        count = 0;
    }
 
public:
    int get_count()
    {
        return count;
    }
    
    stack_t()
    {
        init();
    }
    
    void push(T item)
    {
        ptr_head = new node_t<T>(item, ptr_head); // <-- Тут expected type-specifier before 'ptr_head'
        count++;
    }
    
    T pop() // Тут ошибки
    {
        if (count == 0)
            throw out_of_range("???"); //***
        T resultItem = ptr_head->value;
        ptr_head = ptr_head->next; // поля next нет у тебя
        count--;
    }
 
    void Delete()
    {
        delete ptr_head;
    }
};
 
int main(int argc, char** argv)
{
    stack_t<int> t;
 
    t.push(1);
    t.push(2);
    t.push(3);
 
    //t.pop();
 
    t.Delete();
 
    return 0;
}
Добавлено через 1 минуту
Соколиный глаз, можно так:
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
#include <iostream>
#include <stdexcept>
 
using namespace std;
 
template<typename T>
class node_t
{
private:
    void init(T value, node_t<T>* ptr_next)
    {
        this->value = value; //***
        this->ptr_next = ptr_next; //***
    }
    
public:
    T value;
    node_t<T>* ptr_next;
    
    node_t()
    {
        init(0, NULL);
    }
    
    node_t(T value, node_t<T>* ptr_next)
    {
        init(value, ptr_next);
    }
    
    node_t(const node_t<T>& target)
    {
        init(target->value, target->ptr_next);
    }
    
    ~node_t()
    {
        std::cout << "~node_t()" << std::endl;
        delete ptr_next;
    }
    
    void print()
    {
        cout << value;
    }
};
 
template<typename T>
class stack_t
{
private:
    node_t<T>* ptr_head;
    int count;
 
    void init()
    {
        ptr_head = NULL;
        count = 0;
    }
 
public:
    int get_count()
    {
        return count;
    }
    
    stack_t()
    {
        init();
    }
    
    void push(T item)
    {
        ptr_head = new node_t<T>(item, ptr_head); // <-- Тут expected type-specifier before 'ptr_head'
        count++;
    }
    
    T pop() // Тут ошибки
    {
        if (count == 0)
            throw out_of_range("???"); //***
        T resultItem = ptr_head->value;
        ptr_head = ptr_head->next; // поля next нет у тебя
        count--;
    }
 
    /*void Delete()
    {
        delete ptr_head;
    }*/
    ~stack_t()
    {
        delete ptr_head;
    }
 
};
 
int main(int argc, char** argv)
{
    {stack_t<int> t;
 
    t.push(1);
    t.push(2);
    t.push(3);
 
    //t.pop();
 
    //t.Delete();
    }
 
    return 0;
}
1
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
23.02.2019, 17:37  [ТС]
_stanislav, да, спасибо, помогло. Косяки делаю ибо еще к C++ не адаптировался как следует...
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
23.02.2019, 18:09
Соколиный глаз, по ходу при таком раскладе удалить с верхушки один элемент не получится, удаление нужно не в деструкторе делать.

Добавлено через 1 минуту
Соколиный глаз, вот в этом коде подобную стратегию реализовал, но с удалением, если не лень можешь побегать отладчиком.
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
/***************************************************************************
/Binary search tree/ Copyright (c) by P.S. Gennadevich. All rights reserved.
 V 0.1                                                           30.01.2018.
****************************************************************************/
 
#include <iostream>
 
template<typename TKey, typename TValue> class BinaryTree
{
public:
    // Тип для исключения, если узел не найден
    struct NoElement {};
 
    // Тип для узла дерева
    struct Node
    {
        // Указатель на предка узла
        Node* parent;
 
        // Указатель на левого потомка узла
        Node* left;
        // Указатель на правого потомка узла
        Node* right;
 
        // Ключ узла
        TKey key;
        // Значение узла
        TValue value;
 
        /* Указатель на BinaryTree, служит для обнуления указателя
           BinaryTree::root */
        BinaryTree* pProprietor;
 
        /* Конструктор */
        Node(
                TKey k = 0,
                TValue v = 0,
                Node* l = nullptr,
                Node* r = nullptr,
                Node* p = nullptr,
                BinaryTree* pP = nullptr
            ) :
                key{k},
                value{v},
                left{l},
                right{r},
                parent{p},
                pProprietor{pP}
        {
            std::cout << "Node::Node"
                << std::endl;
        }
        // Деструктор
        ~Node()
        {
            std::cout << "Node::~Node key: "
                << key << std::endl;
        }
 
        // Рекурсивное уничтожение дерева
        void Destroy()
        {
            if (left) left->Destroy();
            if (right) right->Destroy();
 
            delete this;
        }
 
        // Рекурсивный метод поиска узла по ключу
        int Find(TKey k) const
        {
            /* Если k > key поверяем указатель на правого потомка,
               если right != nullptr рекурсивно вызываем Find для
               правого потомка, если right == nullptr бросаем
               исключение NoElement */
            if (k > key)
            {
                if (right) return right->Find(k);
                else throw NoElement();
            }
            /* Если k < key поверяем указатель на левого потомка,
               если left != nullptr рекурсивно вызываем Find для
               левого потомка, если left == nullptr бросаем
               исключение NoElement */
            else if (k < key)
            {
                if (left) return left->Find(k);
                else throw NoElement();
            }
            // Если k == key возвращаем value
            else
            {
                return value;
            }
        }
        // Рекурсивный метод вставки значения v по ключу k
        void Insert(TKey k, TValue v)
        {
            /* Если k > key поверяем указатель на правого потомка,
               если right != nullptr рекурсивно вызываем Insert для
               правого потомка, если right == nullptr создаем нового
               потомка и присваеваем его полям новые значения */
            if(k > key)
            {
                if (right) right->Insert(k, v);
                else
                    right = new Node(k, v, nullptr, nullptr,
                        this, pProprietor);
            }
            /* Если k < key поверяем указатель на левого потомка,
               если left != nullptr рекурсивно вызываем Insert для
               левого потомка, если left == nullptr создаем нового
               потомка и присваеваем его полям новые значения */
            else if (k < key)
            {
                if (left) left->Insert(k, v);
                else
                {
                    left = new Node(k, v, nullptr, nullptr,
                        this, pProprietor);
                }
            }
            // Если k == key присваеваем его полям новые значения
            else
            {
                key = k;
                value = v;
            }
        }
        // Рекурсивный метод удаления узла по ключу
        void Remove(TKey k)
        {
            /* Если k > key поверяем указатель на правого потомка,
               если right != nullptr рекурсивно вызываем Remove для
               правого потомка, если right == nullptr бросаем
               исключение NoElement */
            if (k > key)
            {
                if (right) return right->Remove(k);
                else throw NoElement();
            }
            /* Если k < key поверяем указатель на левого потомка,
               если left != nullptr рекурсивно вызываем Remove для
               левого потомка, если left == nullptr бросаем
               исключение NoElement */
            else if (k < key)
            {
                if (left) return left->Remove(k);
                else throw NoElement();
            }
            // Если k == key рассматривается четыре варианта
            else
            {
                // Если нет ни правого ни левого потомка
                if (!left && !right)
                {
                    if (IsRoot() )
                        pProprietor->root = nullptr;
 
                    else if (IsLeftHeir() )
                        parent->left = nullptr;
 
                    else if (IsRightHeir() )
                        parent->right = nullptr;
 
                }
                // Если есть левый потомок, но нет правого
                else if (left && !right)
                {
                    if (IsRoot() )
                        pProprietor->root = left;
 
                    else if (IsLeftHeir() )
                        parent->left = left;
 
                    else if (IsRightHeir() )
                        parent->right = left;
 
                    left->parent = parent;
                }
                // Если есть правый потомок но нет левого
                else if (!left && right)
                {
                    if (IsRoot() )
                        pProprietor->root = right;
 
                    else if (IsLeftHeir() )
                        parent->left = right;
 
                    else if (IsRightHeir() )
                        parent->right = right;
 
                    right->parent = parent;
                }
                // Если есть оба потомка
                else
                {
                    // Если у правого потомка нет левого узла
                    if (!right->left)
                    {
                        right->parent = parent;
                        right->left = left;
                        left->parent = right;
 
                        if (IsRoot() )
                            pProprietor->root = right;
                    }
                    // Если у правого потомка есть левый узел
                    else
                    {
                        Node* lastLeft = right;
                        while (lastLeft->left)
                            lastLeft = lastLeft->left;
 
                        lastLeft->parent->left = nullptr;
 
                        lastLeft->left = left;
                        lastLeft->right = right;
                        lastLeft->parent = parent;
 
                        if (IsRoot() )
                            pProprietor->root = lastLeft;
                    }
                }
 
                // Удалить текущий узел
                delete this;
            }
        }
 
        // Проверка является ли узел левым потомком
        bool IsLeftHeir()
        {
            return parent->left && parent->left->key == key;
        }
        // Проверка является ли узел правым потомком
        bool IsRightHeir()
        {
            return parent->right && parent->right->key == key;
        }
        // Проверка является ли узел корнем
        bool IsRoot()
        {
            return !parent;
        }
    };
 
    // Указатель на корневой узел дерева
    Node* root;
 
public:
    // Конструктор по умолчанию root = nullptr
    BinaryTree() : root{nullptr}
    {
        // ...
    }
    // Деструктор
    ~BinaryTree()
    {
        root->Destroy();
    }
 
    // Интерфейс Find для связи с Node
    int Find(TKey k)
    {
        if (root == nullptr)
            throw NoElement();
 
        return root->Find(k);
    }
    // Интерфейс Insert для связи с Node
    void Insert(TKey k, TValue v)
    {
        if(root == nullptr)
        {
            root = new Node(k, v, nullptr, nullptr,
                nullptr, this);
 
            return;
        }
 
        root->Insert(k, v);
    }
    // Интерфейс Remove для связи с Node
    void Remove(TKey k)
    {
        if(root == nullptr)
            throw NoElement();
 
        root->Remove(k);
    }
};
Добавлено через 2 минуты
Соколиный глаз, суть такая, что в деструкторе Node delete нельзя прописывать, потому что начинается рекурсивное удаление всех узлов, при удалении верхнего узла
1
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
23.02.2019, 18:14  [ТС]
Цитата Сообщение от _stanislav Посмотреть сообщение
Соколиный глаз, по ходу при таком раскладе удалить с верхушки один элемент не получится, удаление нужно не в деструкторе делать.
А где?

И кстати почему ничего не выводится?
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#include <iostream>
#include <stdexcept>
 
using namespace std;
 
// ===============================================
// Типы:
// ===============================================
 
template<typename T>
class node_t
{
private:
    void init(T value, node_t<T>* ptr_next)
    {
        this->value = value;
        this->ptr_next = ptr_next;
    }
    
public:
    T value;
    node_t<T>* ptr_next;
    
    node_t()
    {
        init(0, NULL);
    }
    
    node_t(T value, node_t<T>* ptr_next)
    {
        init(value, ptr_next);
    }
    
    node_t(const node_t<T>& target)
    {
        init(target->value, target->ptr_next);
    }
    
    ~node_t()
    {
        delete ptr_next;
    }
    
    // Выводит данные узла.
    void print()
    {
        cout << value;
    }
    
    // Выводит данные узла и переходит на новую строку.
    void println()
    {
        print();
        cout << endl;
    }
};
 
template<typename T>
class stack_t
{
private:
    node_t<T>* ptr_head;
    int count;
 
    void init()
    {
        ptr_head = NULL;
        count = 0;
    }
    
    void throw_if_empty()
    {
        if (count == 0)
            throw out_of_range("count был равен 0");
    }
 
public:
    // Возвращает количество элементов стека.
    int get_count()
    {
        return count;
    }
    
    stack_t()
    {
        init();
    }
    
    stack_t(int count, T first, ...)
    {
        init();
        T* ptr_current = &first;
        for (int i = 0; i < count; i++)
        {
            push(*ptr_current);
            ptr_current++;
        }
    }
    
    ~stack_t()
    {
        delete ptr_head;
    }
    
    void push(T item)
    {
        ptr_head = new node_t<T>(item, ptr_head);
        count++;
    }
    
    T pop()
    {
        throw_if_empty();   
        T resultItem = ptr_head->value;
        ptr_head = ptr_head->next_ptr;
        count--;
        return resultItem;
    }
    
    T peek()
    {
        throw_if_empty();
        return ptr_head->value;
    }
    
    // Выводит данные стека.
    void print()
    {
        node_t<T>* ptr_current = ptr_head;
        for (int i = 0; i < count; i++)
        {
            ptr_current->print();
            if (ptr_current->ptr_next)
                cout << ", ";
            ptr_current++;
        }
    }
    
    // Выводит данные стека и переходит на новую строку.
    void println()
    {
        print();
        cout << endl;
    }
};
 
// ===============================================
// Псевдонимы:
// ===============================================
 
typedef stack_t<int> int_stack_t;
typedef stack_t<float> float_stack_t;
typedef stack_t<double> double_stack_t;
typedef stack_t<char> char_stack_t;
typedef stack_t<string> string_stack_t;
 
int main(int argc, char** argv)
{
    int_stack_t* s = new int_stack_t(3, 1, 2, 3);
    s->println();
    delete s;
}
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
23.02.2019, 18:32
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
И кстати почему ничего не выводится?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    // Выводит данные стека.
    void print()
    {
        node_t<T>* ptr_current = ptr_head;
        for (int i = 0; i < count; i++)
        {
            ptr_current->print();
            if (ptr_current->ptr_next)
            {
                ptr_current = ptr_current->ptr_next;
                cout << ", ";
            }
        }
    }
Добавлено через 44 секунды
ты бы сначала функцию pop реализовал.

Добавлено через 2 минуты
Соколиный глаз, вот на тебе код реализованного pop, и удаления верхнего элемента и удаления всего стека.

Добавлено через 27 секунд
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
#include <iostream>
#include <stdexcept>
 
using namespace std;
 
template<typename T>
class node_t
{
private:
    void init(T value, node_t<T>* ptr_next)
    {
        this->value = value; //***
        this->ptr_next = ptr_next; //***
    }
    
public:
    T value;
    node_t<T>* ptr_next;
    
    node_t()
    {
        init(0, NULL);
    }
    
    node_t(T value, node_t<T>* ptr_next)
    {
        init(value, ptr_next);
    }
    
    node_t(const node_t<T>& target)
    {
        init(target->value, target->ptr_next);
    }
    
    ~node_t()
    {
        std::cout << "~node_t()" << value
            << std::endl;
        //delete ptr_next;
    }
    
    void print()
    {
        cout << value;
    }
 
    void Destroy()
    {
        if (ptr_next)
            ptr_next->Destroy();
 
        delete this;
    }
    
    void Delete()
    {
        delete this;
    }
};
 
template<typename T>
class stack_t
{
private:
    node_t<T>* ptr_head;
    int count;
 
    void init()
    {
        ptr_head = NULL;
        count = 0;
    }
 
public:
    int get_count()
    {
        return count;
    }
    
    stack_t()
    {
        init();
    }
    
    void push(T item)
    {
        ptr_head = new node_t<T>(item, ptr_head); // <-- Тут expected type-specifier before 'ptr_head'
        count++;
    }
    
    T pop() // Тут ошибки
    {
        if (count == 0)
            throw out_of_range("???"); //***
 
        T result = ptr_head->value;
 
        node_t<T>* temp = ptr_head;
        ptr_head = ptr_head->ptr_next;
        temp->Delete();
 
        count--;
 
        return result;
    }
    ~stack_t()
    {
        ptr_head->Destroy();
    }
 
};
 
int main(int argc, char** argv)
{
    {stack_t<int> t;
 
    t.push(1);
    t.push(2);
    t.push(3);
 
    int i = t.pop();
 
    //t.Delete();
    }
 
    return 0;
}
1
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
23.02.2019, 18:33  [ТС]
Спасибо!
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
23.02.2019, 18:35
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
У меня вывод всё еще кривой: вместо ожидаемого 1, 2, 3 выводится 2, -1, 1.
не может быть
Миниатюры
Ошибка expected type-specifier before 'ptr_head' при реализации стека  
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
23.02.2019, 18:37  [ТС]
Вот что у меня.
Миниатюры
Ошибка expected type-specifier before 'ptr_head' при реализации стека  
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
23.02.2019, 18:38  [ТС]
Как решить эту проблему (как у меня)?
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
23.02.2019, 18:41
Соколиный глаз, наверно тут ошибка stack_t(int count, T first, ...)

Добавлено через 1 минуту
в смысле в этой функции
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
23.02.2019, 18:44  [ТС]
_stanislav, ты знаешь как эту ошибку убрать?
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
23.02.2019, 18:59
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
ты знаешь как эту ошибку убрать?
пока нет

Добавлено через 54 секунды
забыл как реализовывать функции с переменным числом аргументов

Добавлено через 7 минут
если честно, то я никогда всерьез не пользовался этой фичей.
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
23.02.2019, 18:59  [ТС]
И еще вопрос. Почему такой вариант не работает - зацикливается:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    // Âûâîäèò äàííûå ñòåêà.
    void print()
    {
        node_t<T>* ptr_current = ptr_head;
        while (ptr_current)
        {
            ptr_current->print();
            if (ptr_current->ptr_next)
            {
                cout << ", ";
                ptr_current = ptr_current->ptr_next;
            }
        }
    }
? У меня же:
C++
1
2
3
4
5
    void init()
    {
        ptr_head = NULL; // <--
        count = 0;
    }
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
23.02.2019, 19:07
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
И еще вопрос. Почему такой вариант не работает - зацикливается:
C++
1
2
3
4
5
6
7
8
9
10
11
12
    void print()
    {
        node_t<T>* ptr_current = ptr_head;
        while (ptr_current)
        {
            ptr_current->print();
            ptr_current = ptr_current->ptr_next;
            cout << ", ";
                
 
        }
    }
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
23.02.2019, 19:22  [ТС]
_stanislav, мдэ. Хорошенько накосячил.

Добавлено через 1 минуту
Я про себя.

Добавлено через 7 минут
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#include <iostream>
#include <stdexcept>
 
using namespace std;
 
// Узел стека.
template<typename T>
class node_t
{
private:
    void init(T value, node_t<T>* ptr_next)
    {
        this->value = value;
        this->ptr_next = ptr_next;
    }
    
public:
    T value;
    node_t<T>* ptr_next;
    
    node_t()
    {
        init(0, NULL);
    }
    
    node_t(T value, node_t<T>* ptr_next)
    {
        init(value, ptr_next);
    }
    
    node_t(const node_t<T>& target)
    {
        init(target->value, target->ptr_next);
    }
    
    ~node_t()
    {
        delete this;
    }
    
    // Выводит данные узла.
    void print()
    {
        cout << value;
    }
    
    // Выводит данные узла и переходит на новую строку.
    void println()
    {
        print();
        cout << endl;
    }
};
 
// Стек.
template<typename T>
class stack_t
{
private:
    node_t<T>* ptr_head;
    int count;
 
    void init()
    {
        ptr_head = NULL;
        count = 0;
    }
    
    void throw_if_empty()
    {
        if (count == 0)
            throw out_of_range("count был равен 0");
    }
 
public:
    // Возвращает количество элементов стека.
    int get_count()
    {
        return count;
    }
    
    stack_t()
    {
        init();
    }
    
    stack_t(int count, T* array)
    {
        init();
        T* ptr_current = array;
        for (int i = 0; i < count; i++)
        {
            push(*ptr_current);
            ptr_current++;
        }
    }
    
    stack_t(int count, T first, ...) // Fix: не работает
    {
        init();
        T* ptr_current = &first;
        for (int i = 0; i < count; i++)
        {
            push(*ptr_current);
            ptr_current++;
        }
    }
    
    ~stack_t()
    {
        delete ptr_head;
    }
    
    // Вставляет указанный элемент в стек.
    void push(T item)
    {
        ptr_head = new node_t<T>(item, ptr_head);
        count++;
    }
    
    // Возвращает верхний элемент стека.
    T pop()
    {
        throw_if_empty();   
        T resultItem = ptr_head->value;
        node_t<T>* ptr_to_remove = ptr_head;
        ptr_head = ptr_head->next_ptr;
        delete ptr_to_remove;
        count--;
        return resultItem;
    }
    
    // Возвращает верхний элемент стека.
    T peek()
    {
        throw_if_empty();
        return ptr_head->value;
    }
    
    // Очищает стек.
    void clear()
    {
        node_t<T>* ptr_current = ptr_head;
        while (ptr_current)
        {
            node_t<T>* ptr_to_remove = ptr_current;
            ptr_current = ptr_current->ptr_next;
            delete ptr_to_remove;
        }
    }
    
    // Выводит данные стека.
    void print()
    {
        node_t<T>* ptr_current = ptr_head;
        while (ptr_current)
        {
            ptr_current->print();
            if (ptr_current->ptr_next)
                cout << ", ";
            ptr_current = ptr_current->ptr_next;
        }
    }
    
    // Выводит данные стека и переходит на новую строку.
    void println()
    {
        print();
        cout << endl;
    }
};
 
int main(int argc, char** argv)
{
    stack_t<int>* s = new stack_t<int>(5, new int[5] { 1, 2, 3, 4, 5 });
    s->println();
    delete s;
}
Что имеется.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.02.2019, 19:22
Помогаю со студенческими работами здесь

Шаблон класса. Ошибка `missing type specifier`
Вот код: template &lt;int value, typename type&gt; class Class { public: type Array; type Metod(type x); };

Ошибка при реализации стека
Здравствуйте, помогите пожалуйста разобраться в ошибке.Пишу класс, в нём есть динамический символьный массив, вызываю функцию void без...

Ошибка при реализации стека
Здравствуйте! Делал модуль стека, еще неделю назад работал, вчера так и не смог найти ошибку..( unit Unit_Stack; interface ...

Ошибка C4430: missing type specifier - int assumed
Вот так простенький код #pragma once #include &quot;A.h&quot; class B { public: B(void); ~B(void); }; #pragma once

Ошибка исполнения при реализации стека
#include &lt;iostream&gt; using namespace std; struct item {int a; item*p; }; int main() { item*h,*n; int b;


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru