Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/29: Рейтинг темы: голосов - 29, средняя оценка - 4.66
57 / 43 / 12
Регистрация: 27.10.2018
Сообщений: 454

Исправить ошибку :"Error C2227 left of '->next' must point to class/struct/union/generic type "в фунциях пуш и поп

16.11.2019, 19:47. Показов 5785. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача:Смоделируйте очередь с помощью двух стеков. Добавление элемента в очередь сводится к добавлению к одному из стеков, а проверка, запрос пустой - до проверки, пустые оба стеки. При изъятии элемента из очереди возможны два случая. Если стек, где находится начало очереди, не пустой, то изымается из него элемент. Если он пустой, то предварительно в него переписываются все элементы второго стека, изменяя порядок (это происходит именно при перекладывании из стека в стек) и далее задача сводится к первому случаю.
В стеке , который будет внутри очереди сделал:
C++
1
2
3
4
5
struct Node {
        Node() :elem(0), next(0) {}
        Node* next;
        T elem;
    };
и для итерации по узлах :
C++
1
2
Node* tail;
Node* temp;
но код не компилируеться и выдает ошибку для всех циклов внутри функций пуш и поп очереди , цикл:
C++
1
2
3
4
5
6
7
8
9
first.temp = first.tail;
                for (; i <= first.elemsAmount; i++)
                {
                    for ( y = i; y < first.elemsAmount-2; y++)
                    {
                        temp = temp->next;
                    }
                    temp[y] = temp->elem;
                }
ошибка из названия темы для строк :
C++
1
2
temp = temp->next;
temp[y] = temp->elem;
но я не понимаю почему ведь temp это указатель а структуру Node , также он копия tail, но если строки сверху поменять на
C++
1
first.tail=first.tail->next
то все работает , но перезапись tail мне не подходить потому сделал его локальную копию .Помогите пожалуйста пофиксить , заранее спасибо.
Весь код :
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
#include <string>
#include <iostream>
template<class T>
class Stack{
    struct Node {
        Node() :elem(0), next(0) {}
        Node* next;
        T elem;
    };
public:
    Node* tail;
    int elemsAmount;
 
    Stack() :tail(0),elemsAmount(0){}
    ~Stack(){
        while (tail){
            Node* Temp;
            Temp = tail;
            tail = tail->next;
            delete Temp;}}
    void push(T val){
        Node* Temp;
        Temp = new Node;
        Temp->elem = val;
        if (tail == 0){ 
            tail = Temp;}
        else{
            Temp->next = tail;
            tail = Temp;}
    elemsAmount++;}
    T top(){
        if (tail == 0){
            throw std::string("Stack is empty!");}
        return tail->elem;}
    void pop(){
        if (tail == 0){
            throw std::string("Stack is empty!");}
        Node* delptr = tail;
        tail = tail->next;
        delete delptr;
        elemsAmount--;}
    void print(){
        if (tail == 0){
            throw std::string("Stack is empty!");}
        for (Node* ptr = tail; ptr != 0; ptr = ptr->next){
            std::cout << ptr->elem << ' ';}
        std::cout << '\n';}
    Node* temp;
};
template<class T,int MaxElemsAmount>
class Queue {
private:
    Stack<T> first;
    Stack<T> second;
    const int maxElemsAmount;
    int elemsAmount;
 
public:
    Queue() :maxElemsAmount(MaxElemsAmount), elemsAmount(0) {}
    void push(T data) {
        if (elemsAmount >= maxElemsAmount) {
            std::cout << "Queue is full" << std::endl;
        }
        else if (first.elemsAmount < maxElemsAmount / 2) {
            first.push(data);
        }
        else {
            second.push(data);
        }
        elemsAmount++;
    }
 
 
    void pop() {
        if (elemsAmount <= 0) {
            std::cout << "Queue is empty" << std::endl;
        }
        else if (first.elemsAmount <= maxElemsAmount / 2) {
            int t = maxElemsAmount / 2;
            T *temp = new T(t);
            size_t i = 0;
            size_t y;
            first.temp = first.tail;
                for (; i <= first.elemsAmount; i++)
                {
                    for ( y = i; y < first.elemsAmount-2; y++)
                    {
                        temp = temp->next;
                    }
                    temp[y] = temp->elem;
                }
            for (size_t k = 0; k < i; k++)
            {
                first.push(temp[k + 1]);
            }
            first.elemsAmount--;
            elemsAmount--;
            delete temp;
        }
        else 
        {
            int t = maxElemsAmount / 2;
            T *temp=new T(t);
            size_t i = 0;
            size_t y;
            second.temp = second.tail;
            for (; i <= second.elemsAmount; i++)
            {
                for (y = i; y < second.elemsAmount - 2; y++)
                {
                    temp = temp->next;
                }
                temp[y] = temp->elem;
            }
            for (size_t k = 0; k < i; k++)
            {
                second.push(temp[k + 1]);
            }
            second.elemsAmount--;
            elemsAmount--;
            delete temp;
        }
        
    }
    int last() {
        int t = maxElemsAmount / 2;
        T *temp = new T(t);
        size_t i = 0;
        size_t y;
        second.temp = second.tail;
        for (; i <= second.elemsAmount; i++)
        {
            for (y = i; y < second.elemsAmount - 2; y++)
            {
                temp = temp->next;
            }
            temp[y] = temp->elem;
        }
            y = temp[i];
            delete temp;
            return y;
    }
    int First() {
        int t = maxElemsAmount / 2;
        T *temp = new T(t);
        size_t i = 0;
        size_t y;
        first.temp = first.tail;
                for (; i <= first.elemsAmount; i++)
                {
                    for ( y = i; y < first.elemsAmount-2; y++)
                    {
                        temp = temp->next;
                    }
                    temp[y] = temp->elem;
                }
            y = temp[0];
            delete temp;
        return y;
    }
    int size() {
        return elemsAmount;
    }
    void clear() {
        while(first.Top() != NULL)
        {
            first.pop();
        }
        while (second.Top() != NULL)
        {
            second.pop();
        }
    }
};
int main()
{
    Queue<int,10> queue;
    queue.push(1);
    queue.push(2);
    queue.push(3);
    queue.push(4);
    queue.push(5);
    queue.pop();
    queue.push(6);
    queue.push(7);
    queue.push(8);
    queue.push(9);
    queue.push(10);
 
    system("pause");
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.11.2019, 19:47
Ответы с готовыми решениями:

error C2227 left of "->****" must point to class/struct/union/generic type
Доброго коллеги, поверхностно знаю Си, попросили добавить CheckBox в существующий проект, но, стоит мне сделать хоть что то в форме...

error C2228: left of '.add' must have class/struct/union type. в чем ошибка?
Помогите понять в чем ошибка. Пасиб. #include &lt;iostream.h&gt; class book { private: char name_book; char name_avtor; ...

Не могу исправить error C2228: left of '.isWorked' must have class/struct/union
Добрый день. Есть два взаимодружественных класса.Методом одного, меняю поля другого. Вот код: class Alarm; //класс сигнализации ...

18
24 / 14 / 10
Регистрация: 11.08.2019
Сообщений: 59
16.11.2019, 20:09
plzvtl, так temp же объект типа параметра шаблона, он не знает, что в нём есть до инстанцирования, разве не так?
0
57 / 43 / 12
Регистрация: 27.10.2018
Сообщений: 454
16.11.2019, 20:39  [ТС]
ddvamp1, та я две переменные одинаково назвал и обращался к массиву

Добавлено через 24 минуты
ddvamp1, изменил код на :
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
#include <string>
#include <iostream>
template<class T>
class Stack{
    struct Node {
        Node() :elem(0), next(0) {}
        Node* next;
        T elem;
    };
public:
    Node* tail;
    int elemsAmount;
 
    Stack() :tail(0),elemsAmount(0){}
    ~Stack(){
        while (tail){
            Node* Temp;
            Temp = tail;
            tail = tail->next;
            delete Temp;}}
    void push(T val){
        Node* Temp;
        Temp = new Node;
        Temp->elem = val;
        if (tail == 0){ 
            tail = Temp;}
        else{
            Temp->next = tail;
            tail = Temp;}
    elemsAmount++;}
    T top(){
        if (tail == 0){
            throw std::string("Stack is empty!");}
        return tail->elem;}
    void pop(){
        if (tail == 0){
            throw std::string("Stack is empty!");}
        Node* delptr = tail;
        tail = tail->next;
        delete delptr;
        elemsAmount--;}
    void print(){
        if (tail == 0){
            throw std::string("Stack is empty!");}
        for (Node* ptr = tail; ptr != 0; ptr = ptr->next){
            std::cout << ptr->elem << ' ';}
        std::cout << '\n';}
    Node* temp;
};
template<class T,int MaxElemsAmount>
class Queue {
private:
    Stack<T> first;
    Stack<T> second;
    const int maxElemsAmount;
    int elemsAmount;
 
public:
    Queue() :maxElemsAmount(MaxElemsAmount), elemsAmount(0) {}
    void push(T data) {
        if (elemsAmount >= maxElemsAmount) {
            std::cout << "Queue is full" << std::endl;
        }
        else if (first.elemsAmount < maxElemsAmount / 2) {
            first.push(data);
        }
        else {
            second.push(data);
        }
        elemsAmount++;
    }
 
 
    void pop() {
        if (elemsAmount <= 0) {
            std::cout << "Queue is empty" << std::endl;
        }
        else if (first.elemsAmount <= maxElemsAmount / 2) {
            int t = maxElemsAmount / 2;
            T *tmp = new T[t];
            size_t i = 0;
            size_t y;
            
                for (; i <= first.elemsAmount; i++)
                {
                    first.temp = first.tail;
                    for ( y = i; y < first.elemsAmount-2; y++)
                    {
                        first.temp = first.temp->next;
                    }
                    tmp[y] = first.temp->elem;
                }
                while (first.Top() != NULL)
                {
                    first.pop();
                }
            for (size_t k = 0; k < i; k++)
            {
                first.push(tmp[k + 1]);
            }
            first.elemsAmount--;
            elemsAmount--;
            delete []tmp;
        }
        else 
        {
            int t = maxElemsAmount / 2;
            T *tmp=new T[t];
            size_t i = 0;
            size_t y;
            for (; i <= second.elemsAmount; i++)
            {
                second.temp = second.tail;
                for (y = i; y < second.elemsAmount - 2; y++)
                {
                    second.temp = second.temp->next;
                }
                tmp[y] = second.temp->elem;
            }
            while (second.Top() != NULL)
            {
                second.pop();
            }
            for (size_t k = 0; k < i; k++)
            {
                second.push(tmp[k + 1]);
            }
            second.elemsAmount--;
            elemsAmount--;
            delete[]tmp;
        }
        
    }
    int last() {
        int t = maxElemsAmount / 2;
        T *tmp = new T[t];
        size_t i = 0;
        size_t y;
        
        for (; i <= second.elemsAmount; i++)
        {
            second.temp = second.tail;
            for (y = i; y < second.elemsAmount - 2; y++)
            {
                second.temp = second.temp->next;
            }
            tmp[y] = second.temp->elem;
        }
            y = tmp[i];
            delete[]tmp;
            return y;
    }
    int First() {
        int t = maxElemsAmount / 2;
        T *tmp = new T[t];
        size_t i = 0;
        size_t y;
 
                for (; i <= first.elemsAmount; i++)
                {
                    first.temp = first.tail;
                    for ( y = i; y < first.elemsAmount-2; y++)
                    {
                        first.temp = first.temp->next;
                    }
                    tmp[y] = first.temp->elem;
                }
            y = tmp[0];
            delete[]tmp;
        return y;
    }
    int size() {
        return elemsAmount;
    }
    void clear() {
        while(first.Top() != NULL)
        {
            first.pop();
        }
        while (second.Top() != NULL)
        {
            second.pop();
        }
    }
};
int main()
{
    Queue<int,10> queue;
    queue.push(1);
    queue.push(2);
    queue.push(3);
    queue.push(4);
    queue.push(5);
    queue.pop();
    queue.push(6);
    queue.push(7);
    queue.push(8);
    queue.push(9);
    queue.push(10);
 
    system("pause");
    return 0;
}
Появились новые проблемы : в функции поп:
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
void pop() {
        if (elemsAmount <= 0) {
            std::cout << "Queue is empty" << std::endl;
        }
        else if (first.elemsAmount <= maxElemsAmount / 2) {
            int t = maxElemsAmount / 2;
            T *tmp = new T[t];
            size_t i = 0;
            size_t y;
            
                for (; i <= first.elemsAmount; i++)
                {
                    first.temp = first.tail;
                    for ( y = i; y < first.elemsAmount-2; y++)
                    {
                        first.temp = first.temp->next;
                    }
                    tmp[y] = first.temp->elem;
                }
                while (first.Top() != NULL)
                {
                    first.pop();
                }
            for (size_t k = 0; k < i; k++)
            {
                first.push(tmp[k + 1]);
            }
            first.elemsAmount--;
            elemsAmount--;
            delete []tmp;
        }
        else 
        {
            int t = maxElemsAmount / 2;
            T *tmp=new T[t];
            size_t i = 0;
            size_t y;
            for (; i <= second.elemsAmount; i++)
            {
                second.temp = second.tail;
                for (y = i; y < second.elemsAmount - 2; y++)
                {
                    second.temp = second.temp->next;
                }
                tmp[y] = second.temp->elem;
            }
            while (second.Top() != NULL)
            {
                second.pop();
            }
            for (size_t k = 0; k < i; k++)
            {
                second.push(tmp[k + 1]);
            }
            second.elemsAmount--;
            elemsAmount--;
            delete[]tmp;
        }
для строки :
C++
1
while (first.Top() != NULL)
ошибка :Severity Code Description Project File Line Suppression State
Error C2039 'Top': is not a member of 'Stack<T>' 4.4 c:\users\user\desktop\...\4.4\4.4\source 1.cpp 93
при том что void clear() в котройц есть тоже самое работает.
и в строке :
C++
1
T *tmp = new T[t];
выделение памяти не работает, подскажите пожалуйста как пофиксить, заранее спасибо.
0
фрилансер
 Аватар для Алексей1153
6455 / 5657 / 1129
Регистрация: 11.10.2019
Сообщений: 15,069
16.11.2019, 21:11
Лучший ответ Сообщение было отмечено plzvtl как решение

Решение

plzvtl, не Top, а top

кстати, зачем такое дикое форматирование, жалеешь переносы строки ?
0
57 / 43 / 12
Регистрация: 27.10.2018
Сообщений: 454
16.11.2019, 21:21  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
не Top, а top
Да , спасибо , проглядел,но как clear работал для меня загадка , даже сейчас в одном оставил Top , в другом top и ошибки не было .
Помогите пожалуйста с
C++
1
T *tmp = new T[t];
0
фрилансер
 Аватар для Алексей1153
6455 / 5657 / 1129
Регистрация: 11.10.2019
Сообщений: 15,069
16.11.2019, 21:25
Лучший ответ Сообщение было отмечено plzvtl как решение

Решение

plzvtl, если функция из шаблона не используется, то компилятор проверяет только общий синтаксис, а о наличии конкретных идентификаторов полей и функций он не знает. При инстанцировании уже производится полная проверка
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
16.11.2019, 21:26
Цитата Сообщение от plzvtl Посмотреть сообщение
та я две переменные одинаково назвал и обращался к массиву
На самом деле реальный вопрос: что вообще в классе Stack делает какое-то поле temp и кому и зачем оно там понадобилось. Действительно, зачем?

Цитата Сообщение от plzvtl Посмотреть сообщение
при том что void clear() в котройц есть тоже самое работает.
Нет, не работает. У вас в программе нет никакого Top.

В функции void clear() - абсолютно то же самая ошибка. Вы просто не инстанцировали clear(), поэтому компилятор ее и не проверял.

Цитата Сообщение от plzvtl Посмотреть сообщение
выделение памяти не работает
Что такое "не работает"???
0
фрилансер
 Аватар для Алексей1153
6455 / 5657 / 1129
Регистрация: 11.10.2019
Сообщений: 15,069
16.11.2019, 21:27
Лучший ответ Сообщение было отмечено plzvtl как решение

Решение

Цитата Сообщение от plzvtl Посмотреть сообщение
T *tmp = new T[t];
а что там не так? Вроде компилируется
0
57 / 43 / 12
Регистрация: 27.10.2018
Сообщений: 454
16.11.2019, 21:27  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
На самом деле реальный вопрос: что вообще в классе Stack делает какое-то поле temp и кому и зачем оно там понадобилось. Действительно, зачем?
В функции pop() очереди , она стаовиться копией tail, потому что как я понимаю комплятор незнает как из Stack::Node сделать нод для очереди ,а как добраться к ноду стека из очереи я незнаю , и потому как расход памяти не проверяют то решил просто переменную добавить.
0
57 / 43 / 12
Регистрация: 27.10.2018
Сообщений: 454
16.11.2019, 21:31  [ТС]
Алексей1153, ...
Миниатюры
Исправить ошибку :"Error	C2227	left of '->next' must point to class/struct/union/generic type "в фунциях пуш и поп  
0
фрилансер
 Аватар для Алексей1153
6455 / 5657 / 1129
Регистрация: 11.10.2019
Сообщений: 15,069
16.11.2019, 21:33
plzvtl, всё нормально, память выделилась, заполнена мусором, никто же не обнулил )
0
57 / 43 / 12
Регистрация: 27.10.2018
Сообщений: 454
16.11.2019, 21:34  [ТС]
Теперь еще такая напасть
Миниатюры
Исправить ошибку :"Error	C2227	left of '->next' must point to class/struct/union/generic type "в фунциях пуш и поп  
0
57 / 43 / 12
Регистрация: 27.10.2018
Сообщений: 454
16.11.2019, 21:35  [ТС]
Непонимаю почему tail нуллптр , если в стеке 5 элементов.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
16.11.2019, 21:39
Цитата Сообщение от plzvtl Посмотреть сообщение
В функции pop() очереди , она стаовиться копией tail, потому что как я понимаю
И что из этого? Почему temp вдруг стало полем класса, вместо того, чтобы быть обычной локальной переменной???
0
57 / 43 / 12
Регистрация: 27.10.2018
Сообщений: 454
16.11.2019, 21:42  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
И что из этого? Почему temp вдруг стало полем класса, вместо того, чтобы быть обычной локальной переменной???
Цитата Сообщение от plzvtl Посмотреть сообщение
а как добраться к ноду стека из очереи я незнаю
Как я и написал я незнаю как это сделать.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
16.11.2019, 21:43
Цитата Сообщение от plzvtl Посмотреть сообщение
Алексей1153, ...
Где здесь "выделение памяти не работает"???
0
57 / 43 / 12
Регистрация: 27.10.2018
Сообщений: 454
16.11.2019, 21:44  [ТС]
TheCalligrapher,
Цитата Сообщение от Алексей1153 Посмотреть сообщение
plzvtl, всё нормально, память выделилась, заполнена мусором, никто же не обнулил )
Как бы мне уже объяснили это.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
16.11.2019, 21:45
Цитата Сообщение от plzvtl Посмотреть сообщение
Как я и написал я незнаю как это сделать.
Я не понял. Какое еще "незнаю"? У вас в воде миллион локальных переменных. Но переменную temp вы внезапно сделали нелокальной, вы внезапно сделали ее полем класса. Значит вы это сделали намеренно.

Почему вы это сделали? Какой был ход мыслей? "Незнаю"?
0
57 / 43 / 12
Регистрация: 27.10.2018
Сообщений: 454
17.11.2019, 00:43  [ТС]
Цитата Сообщение от plzvtl Посмотреть сообщение
Непонимаю почему tail нуллптр , если в стеке 5 элементов.
Я понял что оно делает 1 лишнюю итерацию .Сложно.

Добавлено через 42 секунды
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
"Незнаю?"
Хорошо, да.Не могли б вы помочь еще с работой цикла?

Добавлено через 2 часа 47 минут
Новая проблема , в функции pop :
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
void pop() {
        if (elemsAmount <= 0) {
            std::cout << "Queue is empty" << std::endl;
        }
        else if (first.elemsAmount <= maxElemsAmount / 2) {
            int t = maxElemsAmount / 2;
            T *tmp = new T[t];
            size_t i = 0;
            size_t y;
            
                for (; i <= first.elemsAmount; i++)
                {
                    first.temp = first.tail;
                    for ( y = i; y < first.elemsAmount-2; y++)
                    {
                        first.temp = first.temp->next;
                    }
                    tmp[y] = first.temp->elem;
                }
                do
                {
                    first.pop();
                } while (first.top() != 0);
            for (size_t k = 0; k < i; k++)
            {
                first.push(tmp[k + 1]);
            }
            first.elemsAmount--;
            elemsAmount--;
            delete []tmp;
        }
        else 
        {
            int t = maxElemsAmount / 2;
            T *tmp=new T[t];
            size_t i = 0;
            size_t y;
            for (; i <= second.elemsAmount; i++)
            {
                second.temp = second.tail;
                for (y = i; y < second.elemsAmount - 2; y++)
                {
                    second.temp = second.temp->next;
                }
                tmp[y] = second.temp->elem;
            }
            do
            {
                first.pop();
            } while (first.top() != 0);
            for (size_t k = 0; k < i; k++)
            {
                second.push(tmp[k + 1]);
            }
            second.elemsAmount--;
            elemsAmount--;
            delete[]tmp;
        }
        
    }
в строке
C++
1
tmp[y] = first.temp->elem;
не происходит присвоение значений
весь код:
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
#include <string>
#include <iostream>
template<class T>
class Stack{
    struct Node {
        Node() :elem(0), next(0) {}
        Node* next;
        T elem;
    };
public:
    Node* tail;
    int elemsAmount;
 
    Stack() :tail(0),elemsAmount(0){}
    ~Stack(){
        while (tail){
            Node* Temp;
            Temp = tail;
            tail = tail->next;
            delete Temp;}}
    void push(T val){
        Node* Temp;
        Temp = new Node;
        Temp->elem = val;
        if (tail == 0){ 
            tail = Temp;}
        else{
            Temp->next = tail;
            tail = Temp;}
    elemsAmount++;}
    T top(){
        if (this->tail == nullptr) {
            return 0;}
        return tail->elem;}
    void pop(){
        if (tail == 0){
            throw std::string("Stack is empty!");}
        Node* delptr = tail;
        tail = tail->next;
        delete delptr;
        elemsAmount--;}
    void print(){
        if (tail == 0){
            throw std::string("Stack is empty!");}
        for (Node* ptr = tail; ptr != 0; ptr = ptr->next){
            std::cout << ptr->elem << ' ';}
        std::cout << '\n';}
    Node* temp;
};
template<class T,int MaxElemsAmount>
class Queue {
private:
    Stack<T> first;
    Stack<T> second;
    const int maxElemsAmount;
    int elemsAmount;
 
public:
    Queue() :maxElemsAmount(MaxElemsAmount), elemsAmount(0) {}
    void push(T data) {
        if (elemsAmount >= maxElemsAmount) {
            std::cout << "Queue is full" << std::endl;
        }
        else if (first.elemsAmount < maxElemsAmount / 2) {
            first.push(data);
        }
        else {
            second.push(data);
        }
        elemsAmount++;
    }
 
 
    void pop() {
        if (elemsAmount <= 0) {
            std::cout << "Queue is empty" << std::endl;
        }
        else if (first.elemsAmount <= maxElemsAmount / 2) {
            int t = maxElemsAmount / 2;
            T *tmp = new T[t];
            size_t i = 0;
            size_t y;
            
                for (; i <= first.elemsAmount; i++)
                {
                    first.temp = first.tail;
                    for ( y = i; y < first.elemsAmount-2; y++)
                    {
                        first.temp = first.temp->next;
                    }
                    tmp[y] = first.temp->elem;
                }
                do
                {
                    first.pop();
                } while (first.top() != 0);
            for (size_t k = 0; k < i; k++)
            {
                first.push(tmp[k + 1]);
            }
            first.elemsAmount--;
            elemsAmount--;
            delete []tmp;
        }
        else 
        {
            int t = maxElemsAmount / 2;
            T *tmp=new T[t];
            size_t i = 0;
            size_t y;
            for (; i <= second.elemsAmount; i++)
            {
                second.temp = second.tail;
                for (y = i; y < second.elemsAmount - 2; y++)
                {
                    second.temp = second.temp->next;
                }
                tmp[y] = second.temp->elem;
            }
            do
            {
                first.pop();
            } while (first.top() != 0);
            for (size_t k = 0; k < i; k++)
            {
                second.push(tmp[k + 1]);
            }
            second.elemsAmount--;
            elemsAmount--;
            delete[]tmp;
        }
        
    }
    int last() {
        int t = maxElemsAmount / 2;
        T *tmp = new T[t];
        size_t i = 0;
        size_t y;
        
        for (; i <= second.elemsAmount; i++)
        {
            second.temp = second.tail;
            for (y = i; y < second.elemsAmount - 2; y++)
            {
                second.temp = second.temp->next;
            }
            tmp[y] = second.temp->elem;
        }
            y = tmp[i];
            delete[]tmp;
            return y;
    }
    int First() {
        int t = maxElemsAmount / 2;
        T *tmp = new T[t];
        size_t i = 0;
        size_t y;
 
                for (; i <= first.elemsAmount; i++)
                {
                    first.temp = first.tail;
                    for ( y = i; y < first.elemsAmount-2; y++)
                    {
                        first.temp = first.temp->next;
                    }
                    tmp[y] = first.temp->elem;
                }
            y = tmp[0];
            delete[]tmp;
        return y;
    }
    int size() {
        return elemsAmount;
    }
    void clear() {
        while(first.top() != NULL)
        {
            first.pop();
        }
        while (second.top() != NULL)
        {
            second.pop();
        }
    }
};
int main()
{
    int*arr = new int[5];
    Queue<int,10> queue;
    queue.push(1);
    queue.push(2);
    queue.push(3);
    queue.push(4);
    queue.push(5);
    queue.pop();
    queue.push(6);
    queue.push(7);
    queue.push(8);
    queue.push(9);
    queue.push(10);
 
    system("pause");
    return 0;
}
Добавлено через 8 минут
Сам уже понял что не так.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.11.2019, 00:43
Помогаю со студенческими работами здесь

классы - Error 3 error C2228: left of '.BlockAll' must have class/struct/union
Вот имеется у меня 2 класса: Window и Block. В одном из методов класса Window хочу создать объект класса Block. Для этого я к файлу, в...

bug msvc2013 ? left of '.begin' must have class/struct/union error while deducing template parameter
Всем привет! Следующий код валидный, но компиляторы msvc2010 - msvc2013 не хотят его компилировать: template&lt;class t&gt; t...

Библиотека fftw, Error C2228: left of ".real",".imag" must have struct/class/union
#include &quot;stdafx.h&quot; #include &lt;fftw3.h&gt; #include &lt;math.h&gt; #include &lt;complex&gt; using namespace System; static void one(String^...

std::bind1st: is not a class, struct, or union type
Добрый день, пытаюсь найти элемент в списки указателей на объекты классачерез предикат. Вот упрощенный пример: #include...

При компиляции ошибка: C2228: left of ".real",".imag" must have struct/class/union
Помогите, пожалуйста! Компилирую в VS2010... Ошибка: C2228: left of &quot;.real&quot;,&quot;.imag&quot; must have struct/class/union... Почему возникает эта...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru