0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 15
1

Class stack в объектно ориентированном программировании

09.04.2020, 15:57. Показов 1046. Ответов 29
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот вроде понял и что такое стек, и что такое классы и как их реализовать в отдельности. Но как их объеденить в одну программу представления не имею. Пожалуйста, хотя бы подтолкните в нужном направлении, уже много подобных тем просмотрел, но мало что из них понял.
Миниатюры
Class stack в объектно ориентированном программировании  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.04.2020, 15:57
Ответы с готовыми решениями:

Полиморфизм в объектно-ориентированном программировании.Перегрузка функций
Помогите,пожалуйста,написать программу.В DevC++.

Классы в объектно-ориентированном программировании. С++
Здравствуйте! Подскажите, пожалуйста. Необходимо реализовать задачу на языке С++: Создать класс...

Простой калькулятор в объектно-ориентированном стиле
Здравствуйте. А можно написать совсем простой калькулятор типа: Введите 2 числа Выберите...

Реализация задачи в объектно-ориентированном стиле
Здравствуйте. Столкнулась с проблемой. Дали задание на курсовик по ООП в qt. "Требования к...

29
1 / 0 / 1
Регистрация: 20.01.2017
Сообщений: 25
26.04.2020, 23:58 2
А что не получается?
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 15
27.04.2020, 17:36  [ТС] 3
Вот что у меня получилось, но не понимаю почему деструктор не правильно работает
Stack.h
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
#pragma once
#include <iostream>
using namespace std;
class Stack
{
    struct Node
    {
        Node() : next(NULL), value(0)
        {};
        Node(unsigned int val) : value(val)
        {};
        Node(unsigned int val, Node* node_next) : value(val), next(node_next)
        {};
        Node* next;
        unsigned int value;
    };
private:
    
    Node* top_Element;
    Node* this_Element;
    unsigned int amount_of_elements;
public:
    Stack();
    Stack(const Stack& obj);
    
 
    void set_top_Element(unsigned int data_top_Element);
    void set_this_Element(unsigned int data_this_Element);
    unsigned int get_top_Element() const;
    unsigned int get_this_Element() const;
    unsigned int get_amount_of_elements() const;
 
    void push(unsigned int val);
    void pop();
    bool IsEmpty() const;
 
 
    Stack operator + (unsigned int val) ;
    Stack operator - () ;
    Stack operator -- () ;
    Stack operator ++ () ;
    int operator [] (unsigned int index) ;
    friend ostream& operator << (ostream& cout, Stack steck);
    Stack operator = (const Stack& steck);
 
    ~Stack();
};
Stack.cpp
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
#include "Stack.h"
/*----------Constructor and Destructor-----------------*/
Stack::Stack() : top_Element(NULL), this_Element(NULL), amount_of_elements(0)
{}
 
 
Stack::Stack(const Stack& obj) : top_Element(obj.top_Element), this_Element(obj.this_Element), amount_of_elements(obj.amount_of_elements)
{}
 
 
Stack::~Stack()
{
    while (!IsEmpty())
    {
        pop();
    }
}
/*----------Getters and Setters-----------------*/
void Stack::set_top_Element(unsigned int data_top_Element)
{
    top_Element->value = data_top_Element;
}
void Stack::set_this_Element(unsigned int data_this_Element)
{
    this_Element->value = data_this_Element;
}
 
unsigned int Stack::get_top_Element() const
{
    return top_Element->value;
}
unsigned int Stack::get_this_Element() const
{
    return this_Element->value;
}
unsigned int Stack::get_amount_of_elements() const
{
    return amount_of_elements;
}
 
void Stack::push(unsigned int val)
{
    if (top_Element != NULL)
    {
        Node* temp = new Node(val, this_Element);
        this_Element = temp;
        top_Element = this_Element;
    }
    else {
        top_Element = new Node(val);
        this_Element = top_Element;
    }
    amount_of_elements++;
}
 
void Stack::pop()
{
    if (top_Element == NULL)
    {
        cout << "Stack is empty!";
    }
    else
    {
        Node* temp = this_Element;
        this_Element = this_Element->next;
        delete temp;
        top_Element = this_Element;
        amount_of_elements--;
    }
}
 
bool Stack::IsEmpty() const
{
    return amount_of_elements == 0;
}
 
/*----------Operations-----------------*/
Stack Stack::operator+(unsigned int val)
{
    push(val);
    return *this;
}
 
Stack Stack::operator-() 
{
    pop();
    return *this;
}
 
Stack Stack::operator--()
{
 
    this_Element = top_Element;
    return *this;
}
 
Stack Stack::operator++()
{
    if (this_Element != NULL)
    {
        this_Element = this_Element->next;
    }
    else {
        cout << "End of Stack!";
    }
    return *this;
}
 
int Stack::operator[](unsigned int index)
{
    
    if (index > amount_of_elements)
    {
        cout << "Index out of range!";
    }
    else {
        this_Element = top_Element;
        for (Node* temp = top_Element; index > 0; index--, temp = temp->next, this_Element = temp)
        {
        }
        return this_Element->value;
    }
}
 
Stack Stack::operator=(const Stack& steck)
{
    if (this != &steck)
    {
        top_Element = steck.top_Element;
        this_Element = steck.this_Element;
        amount_of_elements = steck.amount_of_elements;
    }
    return *this;
}
 
/*----------Print function-----------------*/
ostream& operator<<(ostream& cout, Stack steck)
{
    if (steck.top_Element != NULL)
    {
        for (int i = 0; i < steck.get_amount_of_elements(); i++)
        {
            cout << "| " << steck[i] << " |";
        }
    }
    else {
        cout << "Stack is empty!";
    }
    return cout;
}
0
1 / 0 / 1
Регистрация: 20.01.2017
Сообщений: 25
27.04.2020, 17:40 4
Чем отличаются this_Element и top_Element?
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 15
27.04.2020, 17:42  [ТС] 5
ничем, это просто по заданию
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
27.04.2020, 22:02 6
Цитата Сообщение от Towara Посмотреть сообщение
Вот что у меня получилось, но не понимаю почему деструктор не правильно работает
У тебя конструктор копирования неправильно написан. Надеюсь, ты его нигде не используешь?
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 15
27.04.2020, 22:41  [ТС] 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
void main()
{
    Stack steck1;
    Stack steck2;
    unsigned int size = 0, del = 0, index = 0;
    cout << "Enter the size of stack: ";
    cin >> size;
 
    for (int i = 0; i < size; i++) {
        steck1.operator+(rand());
    }
    cout << "\nStack:\n";
    cout << steck1;
    steck2 = steck1;
    
    
    do
    {
        cout << "\n\nInput amount of values you want to delete: ";
        cin >> del;
    } while ((del < 0) || (del >= steck2.get_amount_of_elements()));
 
    for (int i = 0; i < del; i++) {
        steck2.operator-();
    }
    
    cout << steck2;
 
    steck2.operator--();
    cout << "\n\nThe value of pointer (moving to the beginning): " << steck2.get_this_Element() << endl;
 
    if (steck2.get_amount_of_elements() > 1)
    {
        steck2.operator++();
        cout << "\nThe value of pointer (moving to the next one): " << steck2.get_this_Element() << endl;
 
    }
    else {
        cout << "\nStack has only one element";
    }
    
    do
    {
        cout << "\nInput index: ";
        cin >> index;
    } while ((index < 0) || (index >= steck2.get_amount_of_elements()));
    steck2.operator[](index);
    cout << "\nThe value of [" << index << "] element of stack: " << steck2.get_this_Element() << endl;
}
Добавлено через 1 минуту
Не могли бы вы помочь с написанием деструктора и конструктора копирования?
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
27.04.2020, 22:44 8
Цитата Сообщение от Towara Посмотреть сообщение
Использую:
Поэтому и деструктор не работает - два раза одни и те же данные
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 15
27.04.2020, 22:45  [ТС] 9
Не могли бы вы помочь с написанием деструктора и конструктора копирования?
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
27.04.2020, 22:51 10
Цитата Сообщение от Towara Посмотреть сообщение
Не могли бы вы помочь с написанием деструктора и конструктора копирования?
Что-то типа
C++
1
2
3
4
5
6
7
8
Stack::Stack(const Stack& obj) 
: top_Element(nullptr)
, this_Element(nullptr)
, amount_of_elements(0)
{
    for (auto *p = obj.top_Element; p; p = p->next)
        push(p->val);
}
Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void Stack::swap(Stack &src)
{
    std::swap(top_Element, src.top_Element);
    std::swap(this_Element, src.this_Element);
    std::swap(amount_of_elements, src.amount_of_elements);
}
 
Stack &Stack::operator=(const Stack &src)
{
    if (this != &src)
        Stack(src).swap(*this)
    return *this;
}
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 15
27.04.2020, 23:02  [ТС] 11
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Что-то типа
C++
1
2
3
4
5
6
7
8
Stack::Stack(const Stack& obj) 
: top_Element(nullptr)
, this_Element(nullptr)
, amount_of_elements(0)
{
    for (auto *p = obj.top_Element; p; p = p->next)
        push(p->val);
}
Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void Stack::swap(Stack &src)
{
    std::swap(top_Element, src.top_Element);
    std::swap(this_Element, src.this_Element);
    std::swap(amount_of_elements, src.amount_of_elements);
}
 
Stack &Stack::operator=(const Stack &src)
{
    if (this != &src)
        Stack(src).swap(*this)
    return *this;
}
Это все один конструктор копирования?
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
27.04.2020, 23:04 12
Цитата Сообщение от Towara Посмотреть сообщение
Это все один конструктор копирования?
В смысле? Это конструктор и оператор копирования. И метод swap
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 15
28.04.2020, 12:43  [ТС] 13
C++
1
2
3
4
5
6
void Stack::swap(Stack &src)
{
    std::swap(top_Element, src.top_Element);
    std::swap(this_Element, src.this_Element);
    std::swap(amount_of_elements, src.amount_of_elements);
}
Пишет что не удается иницилизировать ссылку типа "Stack &" ( квалифицируется как неконстантная) со значением типа Stack::Node*
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
28.04.2020, 13:07 14
Цитата Сообщение от Towara Посмотреть сообщение
Пишет что не удается иницилизировать ссылку типа "Stack &" ( квалифицируется как неконстантная) со значением типа Stack::Node*
Покажи как сделал, весь код
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 15
28.04.2020, 14:44  [ТС] 15
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Покажи как сделал, весь код
Stack.h
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
#pragma once
#include <iostream>
using namespace std;
class Stack
{
    struct Node
    {
        Node* next;
        unsigned int value;
        Node(unsigned int val, Node* node_next) : value(val), next(node_next)
        {};
    };
private:
    
    Node* top_Element;
    Node* this_Element;
    unsigned int amount_of_elements;
public:
    Stack();
    Stack(const Stack& obj);
    ~Stack();
 
    void set_top_Element(unsigned int data_top_Element);
    void set_this_Element(unsigned int data_this_Element);
    unsigned int get_top_Element() const;
    unsigned int get_this_Element() const;
    unsigned int get_amount_of_elements() const;
 
    void push(unsigned int val);
    void pop();
    bool IsEmpty() const;
    void swap(Stack& obj);
 
    Stack operator + (unsigned int val) ;
    Stack operator - () ;
    Stack operator -- () ;
    Stack operator ++ () ;
    int operator [] (unsigned int index) ;
    friend ostream& operator << (ostream& cout, Stack obj);
    Stack& operator = (const Stack& obj);
};
Stack.cpp
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
#include "Stack.h"
/*----------Constructor and Destructor-----------------*/
Stack::Stack() : top_Element(nullptr), this_Element(nullptr), amount_of_elements(0)
{}
 
 
Stack::Stack(const Stack& obj) : top_Element(obj.top_Element), this_Element(obj.this_Element), amount_of_elements(obj.amount_of_elements)
{
    for (Node* temp = obj.top_Element; temp; temp = temp->next)
    {
        push(temp->value);
    }
}
 
 
Stack::~Stack()
{
}
/*----------Getters and Setters-----------------*/
void Stack::set_top_Element(unsigned int data_top_Element)
{
    top_Element->value = data_top_Element;
}
void Stack::set_this_Element(unsigned int data_this_Element)
{
    this_Element->value = data_this_Element;
}
 
unsigned int Stack::get_top_Element() const
{
    return top_Element->value;
}
unsigned int Stack::get_this_Element() const
{
    return this_Element->value;
}
unsigned int Stack::get_amount_of_elements() const
{
    return amount_of_elements;
}
 
void Stack::push(unsigned int val)
{
    if (top_Element != NULL)
    {
        Node* temp = new Node(val, this_Element);
        this_Element = temp;
        top_Element = this_Element;
    }
    else {
        top_Element = new Node(val, nullptr);
        this_Element = top_Element;
    }
    amount_of_elements++;
}
 
void Stack::pop()
{
    if (top_Element == NULL)
    {
        cout << "Stack is empty!";
    }
    else
    {
        Node* temp = this_Element;
        this_Element = this_Element->next;
        delete temp;
        top_Element = this_Element;
        amount_of_elements--;
    }
}
 
bool Stack::IsEmpty() const
{
    return amount_of_elements == 0;
}
 
void Stack::swap(Stack& obj)
{
    swap(top_Element, obj.top_element);
    swap(this_Element, obj.this_Element);
    swap(amount_of_elements, obj.amount_of_elements);
}
 
/*----------Operations-----------------*/
Stack Stack::operator+(unsigned int val)
{
    push(val);
    return *this;
}
 
Stack Stack::operator-() 
{
    pop();
    return *this;
}
 
Stack Stack::operator--()
{
 
    this_Element = top_Element;
    return *this;
}
 
Stack Stack::operator++()
{
    if (this_Element != NULL)
    {
        this_Element = this_Element->next;
    }
    else {
        cout << "End of Stack!";
    }
    return *this;
}
 
int Stack::operator[](unsigned int index)
{
    
    if (index - 1 > amount_of_elements)
    {
        cout << "Index out of range!";
    }
    else {
        Node* temp;
        for (temp = top_Element; index > 0; index--, temp = temp->next)
        {
        }
        return temp->value;
    }
}
 
Stack& Stack::operator=(const Stack& obj)
{
    if (this != &obj)
    {
        Stack(obj).swap(*this);
        /*top_Element = steck.top_Element;
        this_Element = steck.this_Element;
        amount_of_elements = steck.amount_of_elements;*/
    }
    return *this;
}
 
/*----------Print function-----------------*/
ostream& operator<<(ostream& cout, Stack obj)
{
    if (obj.top_Element != NULL)
    {
        for (int i = 0; i < obj.get_amount_of_elements(); i++)
        {
            cout << "| " << obj[i] << " |";
        }
    }
    else {
        cout << "Stack is empty!";
    }
    return cout;
}
main.cpp
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
#include "Stack.h"
 
void main()
{
    Stack steck1;
    Stack steck2;
    unsigned int size = 0, del = 0, index = 0;
    cout << "Enter the size of stack: ";
    cin >> size;
 
    for (int i = 0; i < size; i++) {
        steck1.operator+(rand());
    }
    cout << "\nStack:\n";
    cout << steck1;
    steck2 = steck1;
    
    
    do
    {
        cout << "\n\nInput amount of values you want to delete: ";
        cin >> del;
    } while ((del < 0) || (del >= steck2.get_amount_of_elements()));
 
    for (int i = 0; i < del; i++) {
        steck2.operator-();
    }
    
    cout << steck2;
 
    steck2.operator--();
    cout << "\n\nThe value of pointer (moving to the beginning): " << steck2.get_this_Element() << endl;
 
    if (steck2.get_amount_of_elements() > 1)
    {
        steck2.operator++();
        cout << "\nThe value of pointer (moving to the next one): " << steck2.get_this_Element() << endl;
 
    }
    else {
        cout << "\nStack has only one element";
    }
    
    do
    {
        cout << "\nInput index: ";
        cin >> index;
    } while ((index < 0) || (index >= steck2.get_amount_of_elements()));
    steck2.operator[](index);
    cout << "\nThe value of [" << index << "] element of stack: " << steck2.get_this_Element() << endl;
}
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
28.04.2020, 14:49 16
Цитата Сообщение от Towara Посмотреть сообщение
void Stack::swap(Stack& obj)
{
    swap(top_Element, obj.top_element);
    swap(this_Element, obj.this_Element);
    swap(amount_of_elements, obj.amount_of_elements);
}
Добавь std::
C++
1
2
3
    std::swap(top_Element, obj.top_Element);
    std::swap(this_Element, obj.this_Element);
    std::swap(amount_of_elements, obj.amount_of_elements);
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 15
28.04.2020, 15:08  [ТС] 17
Не помогло
Миниатюры
Class stack в объектно ориентированном программировании  
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
28.04.2020, 15:09 18
Цитата Сообщение от Towara Посмотреть сообщение
Не помогло
top_Element
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 15
28.04.2020, 15:39  [ТС] 19
Да не в этом же проблема
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
28.04.2020, 15:41 20
Цитата Сообщение от Towara Посмотреть сообщение
Да не в этом же проблема
В этом. Не видишь что-ли, что у тебя там top_еlement с маленькой буквы, красным подчёркнуто
0
28.04.2020, 15:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.04.2020, 15:41
Помогаю со студенческими работами здесь

В объектно ориентированном создать Информатический словарь
Помогите пожалуйста, всю голову себе сломал... нужно в объектно ориентированном создать...

Обработка символьных данных в объектно-ориентированном программировании
Подскажите пожалуйста как программу приведеную ниже заставить правильно работать. В консоле все...

Составить программу на встроенном объектно - ориентированном языке Visual Basic for Applications (VBA)

Подскажите где можно использовать class Stack
Изучил class Stack а где его применять не знаю.

Ошибка: Exception class EStackOverflow with message 'Stack overflow'
--------------------------- Debugger Exception Notification --------------------------- Project...

[bcc32 Error] File1.cpp(19): E2316 'Stack<T>::Stack()' is not a member of 'Stack<T>'
Возникает ошибка File1.cpp(19): E2316 'Stack&lt;T&gt;::Stack()' is not a member of 'Stack&lt;T&gt;' ...


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

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

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