14 / 10 / 7
Регистрация: 13.06.2020
Сообщений: 260
1

Ошибка в реализации класса стек

03.07.2020, 18:44. Показов 1210. Ответов 7
Метки c++ (Все метки)

Author24 — интернет-сервис помощи студентам
Методы стека:
- top() возвращает ссылку на элемнет из вершины стека
- pop() удаляет элемент из вершины стека
- push(element) добавляет элемент на вершину стека
- size() возвращает количество элементов в стеке
- swap(other_stack) обменивает содержимым два стека
- empty() возвращает true если стек пуст и false в противном случае
- конструкторы/операторы копирования/перемещения
- распечатайте содержимое стека за пределами класса stack

Значит вот я реализовал свой класс стек, вроде работает но ошибка вылезает и четь мусор выводит

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>
 
class Stack {
public:
    Stack() = default;
    Stack(const Stack& other) :size(other.size) {
        this->data = new int[other.size];
        for (size_t i = 0; i < other.size; i++) {
            this->data[i] = other.data[i];
        }
    }
 
    Stack& operator=(const Stack& x) {
        if (&x != this) {
            delete[] data;
 
            this->data = new int[x.size];
            for (size_t i = 0; i < x.size; i++) {
                this->data[i] = x.data[i];
            }
            size = x.size;
        }
        return *this;
    }
 
    Stack(Stack&& other) noexcept : size(other.size), data(other.data) {
        other.data = nullptr;
        other.size = 0;
    }
 
    Stack& operator=(Stack&& x) noexcept {
        if (&x != this) {
            delete[] data;
            size = x.size;
            data = x.data;
 
            x.data = nullptr;
            x.size = 0;
 
        }
        return *this;
    }
    void setSize(size_t size) {
        this->size = size;
    }
    void push(size_t element){
        int* copy_arr = new int[size + 1];
        for (size_t i = 0; i < size; i++) {
            copy_arr[i] = data[i];
        }
        copy_arr[size] = element;
        size++;
        delete[] data;
        data = copy_arr;
    }
    void pop() {
        int* copy_arr = new int[size - 1];
        for (size_t i = 0; i < size; i++) {
            copy_arr[i] = data[i];
        }
        size--;
        delete[] data;
        data = copy_arr;
    }
    int top() {
        return data[0];
    }
    bool isEmpty() {
        return size == 0;
    }
    int get(size_t index) {
        return data[index];
    }
    int getSize() {
        return size;
    }
 
 
    ~Stack() {
        
    }
 
private:
    size_t size;
    int* data = new int[size];
};
 
void print(Stack& stack) {
    for (size_t i = 0; i < stack.getSize(); i++) {
        std::cout.width(7);
        std::cout << stack.get(i);
    }
    std::cout << std::endl;
}
 
int main() {
 
    Stack stack;
    stack.setSize(3);
    stack.push(1);
    stack.push(2);
    stack.push(3);
 
    print(stack);
 
    stack.pop();
    stack.pop();
 
    print(stack);
 
}
И был бы рад если вы момогли мне еще с методом - swap(other_stack) обменивает содержимым два стека

Добавлено через 7 минут
поправка на код, только заметил что метод top() не правильно работает, там должен быть return data[size-1]
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.07.2020, 18:44
Ответы с готовыми решениями:

Ошибка реализации класса String
#include &lt;iostream&gt; using namespace std; class String { private: char *pStr; int _size;...

Ошибка компиляции при реализации класса-шаблона
Не могу понять почему компилятор ругается. Помогите разобраться. #include &lt;iostream&gt; using...

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

Ошибка при реализации класса, использующего шаблоннный тип.
Пытаюсь реализовать шаблон Strategy в STR.h пишу template&lt;class StrategyType&gt; class Context...

7
2523 / 1243 / 459
Регистрация: 08.11.2016
Сообщений: 3,415
03.07.2020, 19:03 2
Что за метод setSize? Избавьтесь от него. У Вас же push и pop регулируют размер - ставить его руками, да еще и за пределами класса - гарантия простреленной ноги.

метод своп сделайте по принципу перемещения, только в теле обменяйте поля size и указатели на data через временные переменные
1
14 / 10 / 7
Регистрация: 13.06.2020
Сообщений: 260
03.07.2020, 19:17  [ТС] 3
Цитата Сообщение от Annemesski Посмотреть сообщение
Что за метод setSize? Избавьтесь от него. У Вас же push и pop регулируют размер - ставить его руками, да еще и за пределами класса - гарантия простреленной ноги.

метод своп сделайте по принципу перемещения, только в теле обменяйте поля size и указатели на data через временные переменные
Ошибка в реализации класса стек


Если я уберу setSize() вылезает теперь такая ошибка
0
"C with Classes"
1645 / 1402 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
03.07.2020, 19:38 4
Цитата Сообщение от rfl Посмотреть сообщение
Если я уберу setSize() вылезает теперь такая ошибка
можешь не убирать, в private секцию перемести

Добавлено через 5 минут
Цитата Сообщение от rfl Посмотреть сообщение
И был бы рад если вы момогли мне еще с методом - swap(other_stack) обменивает содержимым два стека
C++
1
2
3
4
5
6
void swap(Stack& a, Stack& b) noexcept
{ 
    Stack tmp(std::move(a) ); /* в tmp перемещается значение a, это гораздо дешевле */
    a = std::move(b); 
    b = std::move(tmp);
}
1
14 / 10 / 7
Регистрация: 13.06.2020
Сообщений: 260
03.07.2020, 19:38  [ТС] 5
Цитата Сообщение от _stanislav Посмотреть сообщение
можешь не убирать, в private секцию перемести
Ну это не помогает избавиться от этой ошибки
0
"C with Classes"
1645 / 1402 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
03.07.2020, 19:41 6
Цитата Сообщение от rfl Посмотреть сообщение
Ну это не помогает избавиться от этой ошибки
ты неверное код где то правил когда удалял setSize, верни как было все, но setSize в private, до удаления setSize ошибке же не было.
1
14 / 10 / 7
Регистрация: 13.06.2020
Сообщений: 260
03.07.2020, 19:46  [ТС] 7
Цитата Сообщение от _stanislav Посмотреть сообщение
ты неверное код где то правил когда удалял setSize, верни как было все, но setSize в private, до удаления setSize ошибке же не было.
Это ошибка была с самого начала

Добавлено через 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
class Stack {
public:
    Stack() = default;
    Stack(const Stack& other) :size(other.size) {
        this->data = new int[other.size];
        for (size_t i = 0; i < other.size; i++) {
            this->data[i] = other.data[i];
        }
    }
 
    Stack& operator=(const Stack& x) {
        if (&x != this) {
            delete[] data;
 
            this->data = new int[x.size];
            for (size_t i = 0; i < x.size; i++) {
                this->data[i] = x.data[i];
            }
            size = x.size;
        }
        return *this;
    }
 
    Stack(Stack&& other) noexcept : size(other.size), data(other.data) {
        other.data = nullptr;
        other.size = 0;
    }
 
    Stack& operator=(Stack&& x) noexcept {
        if (&x != this) {
            delete[] data;
            size = x.size;
            data = x.data;
 
            x.data = nullptr;
            x.size = 0;
 
        }
        return *this;
    }
    void setSize(size_t size) {
        this->size = size;
    }
    void push(size_t element){
        int* copy_arr = new int[size + 1];
        for (size_t i = 0; i < size; i++) {
            copy_arr[i] = data[i];
        }
        copy_arr[size] = element;
        size++;
        delete[] data;
        data = copy_arr;
    }
    void pop() {
        int* copy_arr = new int[size - 1];
        for (size_t i = 0; i < size; i++) {
            copy_arr[i] = data[i];
        }
        size--;
        delete[] data;
        data = copy_arr;
    }
    int top() {
        return data[size-1];
    }
    bool isEmpty() {
        return size == 0;
    }
    int get(size_t index) {
        return data[index];
    }
    int getSize() {
        return size;
    }
 
 
    ~Stack() {
        
    }
 
private:
    size_t size;
    int* data = new int[size];
};
 
void print(Stack& stack) {
    for (size_t i = 0; i < stack.getSize(); i++) {
        std::cout.width(7);
        std::cout << stack.get(i);
    }
    std::cout << std::endl;
}
 
void _swap(Stack& a, Stack& b) {
    Stack tmp(std::move(a));
    a = std::move(b);
    b = std::move(tmp);
}
 
int main() {
 
    Stack stack;
    stack.push(1);
    stack.push(2);
    stack.push(3);
 
    print(stack);
    stack.pop();
    stack.pop();
    print(stack);
    std::cout<<stack.top();
 
 
 
    
}
0
2523 / 1243 / 459
Регистрация: 08.11.2016
Сообщений: 3,415
03.07.2020, 19:53 8
Лучший ответ Сообщение было отмечено rfl как решение

Решение

1. setSize() уберите и никогда о нем не вспоминайте
2. метод push должен добавлять новый элемент в data[0], и почему у вас element типа size_t когда data указатель на int?
C++
1
2
3
4
5
6
7
8
9
10
void push(int element){
    int* copy_arr = new int[size + 1];
    for (size_t i = 0; i < size; i++) {
        copy_arr[i + 1] = data[i];
    }
    copy_arr[0] = element;
    size++;
    delete[] data;
    data = copy_arr;
}
3. метод pop() тоже должен выталкивать элемент data[0]
C++
1
2
3
4
5
6
7
8
9
void pop() {
    int* copy_arr = new int[size - 1];
    for (size_t i = 0; i < size - 1; i++) {
        copy_arr[i] = data[i + 1];
    }
    size--;
    delete[] data;
    data = copy_arr;
}
4. метод swap
C++
1
2
3
4
5
6
7
8
9
10
11
void swap(Stack &other)       
{                             
    if (this == &other)       
        return;               
    size_t tmpSz = other.size;
    other.size = size;        
    size = tmpSz;             
    int *tmpData = other.data;
    other.data = data;        
    data = tmpData;           
}
1
03.07.2020, 19:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.07.2020, 19:53
Помогаю со студенческими работами здесь

Отделение интерфейса от реализации класса: компиляция кода реализации
Доброго времени суток, У меня возникла проблема с отделением интерфейса от реализации класса....

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

Отделение интерфейса класса от реализации (Ошибка при компиляции)
Не могу решить проблему... При попытке скомпилировать исходник из дейтелловской книги получаю...

Написать шаблон класса на основе класса vector для реализации стековой структуры данных
Пыталась написать код, но не уверена будет ли такая реализация корректной, можно ли это сделать...

Ошибка в программе, где создается шаблон класса "стек"
Задача:Гаражная стоянка имеет одну стояночную полосу, причем единственный въезд и единственный...

Создать стек строковых значений, для реализации используя односвязные списки
2. Создать стек строковых значений, для реализации используя односвязные списки. Реализовать...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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