Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 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. Показов 5777. Ответов 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
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,057
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
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,057
16.11.2019, 21:25
Лучший ответ Сообщение было отмечено plzvtl как решение

Решение

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

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

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

Цитата Сообщение от plzvtl Посмотреть сообщение
выделение памяти не работает
Что такое "не работает"???
0
фрилансер
 Аватар для Алексей1153
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,057
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
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,057
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
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,217
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
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,217
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
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,217
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): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru