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

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

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

Author24 — интернет-сервис помощи студентам
Третий заход. Как-то пока мне не везёт в 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.02.2019, 16:27
Ответы с готовыми решениями:

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

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

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

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

17
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
23.02.2019, 16:40 2
Соколиный глаз, отметил где покопался
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
Записей в блоге: 9
23.02.2019, 16:53  [ТС] 3
в смысле удаление узла с верхушки стека?
Не, удаление деструктором объекта node_t<T>.
0
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
23.02.2019, 17:14 4
Соколиный глаз, твой код в принципе уже может удалять ноды, деструктор рекурсивно будет вызываться, на проверь:
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
Записей в блоге: 9
23.02.2019, 17:37  [ТС] 5
_stanislav, да, спасибо, помогло. Косяки делаю ибо еще к C++ не адаптировался как следует...
0
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
23.02.2019, 18:09 6
Соколиный глаз, по ходу при таком раскладе удалить с верхушки один элемент не получится, удаление нужно не в деструкторе делать.

Добавлено через 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
Записей в блоге: 9
23.02.2019, 18:14  [ТС] 7
Цитата Сообщение от _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"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
23.02.2019, 18:32 8
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
И кстати почему ничего не выводится?
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
Записей в блоге: 9
23.02.2019, 18:33  [ТС] 9
Спасибо!
0
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
23.02.2019, 18:35 10
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
У меня вывод всё еще кривой: вместо ожидаемого 1, 2, 3 выводится 2, -1, 1.
не может быть
Миниатюры
Ошибка expected type-specifier before 'ptr_head' при реализации стека  
0
Alvin Seville
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
23.02.2019, 18:37  [ТС] 11
Вот что у меня.
Миниатюры
Ошибка expected type-specifier before 'ptr_head' при реализации стека  
0
Alvin Seville
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
23.02.2019, 18:38  [ТС] 12
Как решить эту проблему (как у меня)?
0
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
23.02.2019, 18:41 13
Соколиный глаз, наверно тут ошибка stack_t(int count, T first, ...)

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

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

Добавлено через 7 минут
если честно, то я никогда всерьез не пользовался этой фичей.
0
Alvin Seville
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
23.02.2019, 18:59  [ТС] 16
И еще вопрос. Почему такой вариант не работает - зацикливается:
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"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
23.02.2019, 19:07 17
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
И еще вопрос. Почему такой вариант не работает - зацикливается:
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
Записей в блоге: 9
23.02.2019, 19:22  [ТС] 18
_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
23.02.2019, 19:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.02.2019, 19:22
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru