С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 11.08.2018
Сообщений: 2
1

Оцените Stack

11.08.2018, 02:25. Показов 549. Ответов 6

Author24 — интернет-сервис помощи студентам
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
#include "stdafx.h"
#include <iostream>
using namespace std;
 
class Stack
{
private:
    int push_index = 0;
    int n = 5;
    int *arr;
public:
    bool is_empty();
    void add();
    void exclude();
    void push(int value);
    int pop();
    int show();
};
 
bool Stack::is_empty()
{
    return push_index == 0;
}
 
void Stack::add()
{
    int *new_arr = new int[n * 2];
    for (int i = 0; i < n; i++)
    {
        new_arr[i] = arr[i];
    }
    delete[] arr;
    arr = new_arr;
    n *= 2;
}
 
void Stack::exclude()
{
    int *new_arr = new int[n / 2];
    for (int i = 0; i < n; i++)
    {
        new_arr[i] = arr[i];
    }
    delete[] arr;
    arr = new_arr;
    n /= 2;
}
 
void Stack::push(int value)
{
    if (push_index == n)
    {
        add();
    }
    arr[push_index] = value;
    push_index++;
}
 
int Stack::pop()
{
    if (push_index == n * 0.4)
    {
        exclude();
    }
    push_index--;
    return arr[push_index];
}
 
int Stack::show()
{
    return n;
}
 
bool stack_test()
{
    bool test_passed = true;
    Stack st;
    st.push(1);
    st.push(2);
    st.push(3);
    st.push(4);
    st.push(5);
    st.push(6);
    st.push(7);
    test_passed &= st.pop() == 7;
    test_passed &= st.pop() == 6;
    test_passed &= st.pop() == 5;
    test_passed &= st.pop() == 4;
    test_passed &= st.pop() == 3;
    test_passed &= st.pop() == 2;
    test_passed &= st.pop() == 1;
    return test_passed;
}
 
bool emptiness_test()
{
    bool test_passed = true;
    Stack st;
    test_passed &= st.is_empty();
    st.push(5);
    test_passed &= !st.is_empty();
    st.pop();
    test_passed &= st.is_empty();
    return test_passed;
}
 
int main()
{
    if (emptiness_test())
    {
        cout << "test passed" << endl;
    }
    else
    {
        cout << "test failed" << endl;
    }
 
    if (stack_test())
    {
        cout << "test passed" << endl;
    }
    else
    {
        cout << "test failed" << endl;
    }
 
    system("pause");
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Блог
11.08.2018, 02:25
Ответы с готовыми решениями:

Есть ли связь между STL-stack и stack - высокопроизводительная память?
Куча источников, как всегда много отсебятины, в общем я запутался...

Ошибка: "Unhandled exception: Stack cookie instrumentation code detected a stack-based buffer overrun"
Не могу понять почему значение ChoiceOfPlayer меняется и почему NumberOfRow и NumberOfColumn всегда...

stack
не могу норм прокомпилировать прогу, вот код, подскажите что не так! #include &lt;stack&gt; #include...

Stack overflow
Реализовал структуру данных стек на связном списке, очистку решил возложить на деструкторы узлов,...

6
4264 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,520
Записей в блоге: 1
11.08.2018, 04:28 2
конструктора нет, деструктора нет, конструктора копий нет,
о move семантике не заикаюсь даже
класс ничем не автоматизирован - пользователя заставляют фактически вручную выделять память методами
add()/exclude()
автор точно не забыл, что он стек делает, а не массив и не вектор? Такое чувство, что половина кода тупо из другого подобного класса скопирована.

Добавлено через 2 минуты
поправка, add/exclude и правда вызываются не вручную, как я подумал, а из push() pop()
Тогда почему они публичные?
0
Модератор
Эксперт С++
13722 / 10919 / 6478
Регистрация: 18.12.2011
Сообщений: 29,148
11.08.2018, 09:41 3
Распространенные ошибки:
Нарушение правила ТРЕХ.
0
5 / 5 / 1
Регистрация: 20.07.2018
Сообщений: 24
11.08.2018, 10:02 4
Желательно было бы посмотреть сначала реализацию стека у других людей, а так же почитать про конструктор копирования,оператор присваивания и деструктор : вы не чистите память,выделенную динамически,а про копирование и присваивание вообще молчу . Функции-члены execlude и add,исходя из контекста,являются чисто вспомогательными функциями,которые желательно было бы занести в private или хотя бы в protected (зачем нам нужны детали реализации? это ведь порождает зависимость).

Хорошо,кстати,все эти темы рассмотрены в книге Стивена Праты (Хоть там стек и постоянного размера).
0
139 / 67 / 46
Регистрация: 15.10.2015
Сообщений: 308
11.08.2018, 14:24 5
Вот мой пример стека. Тоже хотел бы выслушать критиу. Что можно упростить, улучшить?
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
#ifndef _STACK_H_
#define _STACK_H_
//-------------------------------------------------------------------------------------------------
template <typename Type>
class Stack
{
private:
    struct Node
    {
        Type element = {};
        Node* next = nullptr;
    };
    size_t count;
    Node* tail;
public:
    //Member functions
    Stack();
    Stack(const Stack & stk);
    Stack(Stack && stk);
    Stack & operator = (const Stack & stk);
    Stack & operator = (Stack && stk);
    ~Stack();
    
    //Element access
    const Type & top() const;
 
    //Capacity
    bool empty() const;
    size_t size() const;
 
    //Modifiers
    void push(const Type & val);
    void push(Type && val);
    void swap(Stack & stk);
    //emplace Not implemented
    void pop();
};
//-------------------------------------------------------------------------------------------------
template <typename Type>
Stack<Type>::Stack() : count(0), tail(nullptr)
{
    //Body of the constructor class
}
//-------------------------------------------------------------------------------------------------
template <typename Type>
Stack<Type>::Stack(const Stack & stk) : count(stk.count), tail(nullptr)
{
    Node **n_ptr_next = &tail;
    for (const Node* n_ptr = stk.tail; n_ptr != nullptr; n_ptr = n_ptr->next)
    {
        Node* n_ptr_new = new Node(*n_ptr);
        *n_ptr_next = n_ptr_new;
        n_ptr_next = &n_ptr_new->next;
    }
    *n_ptr_next = nullptr;
}
//-------------------------------------------------------------------------------------------------
template <typename Type>
Stack<Type>::Stack(Stack && stk) : count(stk.count), tail(stk.tail)
{
    stk.count = 0;
    stk.tail = nullptr;
}
//-------------------------------------------------------------------------------------------------
template <typename Type>
Stack<Type> & Stack<Type>::operator = (const Stack & stk)
{
    if (this == &stk)
    {
        return *this;
    }
 
    Stack temp(stk);
    std::swap(tail, temp.tail);
    std::swap(count, temp.count);
    return *this;
}
//-------------------------------------------------------------------------------------------------
template <typename Type>
Stack<Type> & Stack<Type>::operator = (Stack && stk)
{
    if (this == &stk)
    {
        return *this;
    }
 
    std::swap(tail, stk.tail);
    std::swap(count, stk.count);
    return *this;
}
//-------------------------------------------------------------------------------------------------
template <typename Type>
Stack<Type>::~Stack()
{
    while (tail)
    {
        Node* n_ptr_del = tail;
        tail = tail->next;
        delete n_ptr_del;
    }
    count = 0;
}
//-------------------------------------------------------------------------------------------------
template <typename Type>
void Stack<Type>::push(Type && val)
{
    Node* n_ptr_new = new Node;
    n_ptr_new->element = val;
    count++;
    n_ptr_new->next = tail;
    tail = n_ptr_new;
}
//-------------------------------------------------------------------------------------------------
template <typename Type>
void Stack<Type>::push(const Type & val)
{
    Node* n_ptr_new = new Node;
    n_ptr_new->element = val;
    count++;
    n_ptr_new->next = tail;
    tail = n_ptr_new;
}
//-------------------------------------------------------------------------------------------------
template <typename Type>
void Stack<Type>::pop()
{
    Node* n_ptr_del = tail;
    tail = tail->next;
    count--;
    delete n_ptr_del;
}
//-------------------------------------------------------------------------------------------------
template <typename Type>
const Type & Stack<Type>::top() const
{
    if (empty())
    {
        throw std::runtime_error("Stack<Type>::top: empty stack");
    }
    return tail->element;
}
//-------------------------------------------------------------------------------------------------
template <typename Type>
size_t Stack<Type>::size() const
{
    return count;
}
//-------------------------------------------------------------------------------------------------
template <typename Type>
bool Stack<Type>::empty() const
{
    return tail == nullptr;
}
//-------------------------------------------------------------------------------------------------
template <typename Type>
void Stack<Type>::swap(Stack & stk)
{
    Stack temp(stk);
    stk = std::move(*this);
    *this = std::move(temp);
}
//-------------------------------------------------------------------------------------------------
#endif // STACK_H_
0
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
11.08.2018, 19:19 6
Reavolt, здравствуйте, по поводу класса не могу ничего сказать т к сам вхожу в число начинающих программистов на C++
Хочется узнать о паре вещей в вашем коде, вы не могли бы объяснить причину почему вы тут используете двойную ссылку(могу ошибаться с термином)?
Цитата Сообщение от Reavolt Посмотреть сообщение
C++
1
2
3
Stack(Stack && stk);
Stack & operator = (Stack && stk);
void push(Type && val);

Цитата Сообщение от Reavolt Посмотреть сообщение
C++
1
2
stk = std::move(*this);
*this = std::move(temp);
Что такое move? Зачем он тут нужен
0
139 / 67 / 46
Регистрация: 15.10.2015
Сообщений: 308
11.08.2018, 19:46 7
no swear,
1) Это конструктор перемещения и оператор присваивания перемещением (подробнее читайте про move semantics и правило 5).
2) std::move() - это функция, которая создает ссылку rvalue для объекта. (фактически ничего не перемещает)
1
11.08.2018, 19:46
cpp_developer
Эксперт
20123 / 5690 / 417
Регистрация: 09.04.2010
Сообщений: 12,546
Блог
11.08.2018, 19:46
Помогаю со студенческими работами здесь

Stack overflow
Написал #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; #include &lt;math.h&gt; #include...

Stack overflow.
У меня в программе есть реверсивная функция (много параметров) она вызывает себя очень много раз....

Stack was corrupted
Будьте добры, объясните, почему такая ошибку выдает: Run-Time Check Failure #2 - Stack around...

Stack и указатели c++
Есть следующий Стэк #ifndef _LINKED_STACK #define _LINKED_STACK #include &quot;StackInterface.h&quot;...


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

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