С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 05.09.2019
Сообщений: 34

Ошибка при объединении стеков

22.04.2020, 11:35. Показов 2392. Ответов 44
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задание:
Составить описание шаблонного класса стека. При создании экземпляра класса стека должен указываться максимальный размер стека и соответственно при добавлении элементов необходимо следить за переполнением стека. В случае переполнения стека должно выходить сообщение об ошибке. Предусмотреть функции для добавления элемента в стек push() и изъятие элемента из стека pop(). А также реализовать функцию объединения двух стеков в новый.

Стек создаю, push и pop работают, но не понимаю, как сделать максимальный размер стека. И еще не получается объединение стеков. Пишет кучу ошибок: friend не разрешается для объявления данных; StackCombination переопределение, предыдущим определением было "переменная данных"; в ближайшей области пространства имен не удалось найти дружественное объявление.

Помогите исправить, пожалуйста

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
#pragma once
#include <iostream>
#include <iomanip>
using namespace std;
 
template <typename T>
class Stack
{
private:
    T *stackPtr; // указатель на стек
    int size; // размер стека
    T top; // вершина стека
public:
    Stack(int = 10);// по умолчанию размер стека равен 10 элементам
    ~Stack(); // деструктор
    bool push(const T); // поместить элемент в стек
    bool pop(); // удалить из стека элемент
    void printStack();
    friend Stack StackCombination<T>(const Stack<T>& first, const Stack<T>& second);
};
 
// конструктор
template <typename T>
Stack<T>::Stack(int s)
{
    size = s > 0 ? s : 10;   // инициализировать размер стека
    stackPtr = new T[size]; // выделить память под стек
    top = -1; // значение -1 говорит о том, что стек пуст
}
 
// деструктор
template <typename T>
Stack<T>::~Stack()
{
    delete[] stackPtr; // удаляем стек
}
 
// элемент функция класса  Stack для помещения элемента в стек
// возвращаемое значение: true - операция успешно завершена, false - элемент в стек не добавлен
template <typename T>
bool Stack<T>::push(const T value)
{
    if (top == size - 1)
    {
        throw std::out_of_range("Stack is full!");
        return false; // стек полон
    }
 
    top++;
    stackPtr[top] = value; // помещаем элемент в стек
 
    return true; // успешное выполнение операции
}
 
// элемент функция класса  Stack для удаления элемента из стек
// возвращаемое значение: true - операция успешно завершена, false - стек пуст
template <typename T>
bool Stack<T>::pop()
{
    if (top == -1)
    {
        throw std::out_of_range("Stack is empty!");
        return false; // стек пуст
    }
    stackPtr[top] = 0; // удаляем элемент из стека
    top--;
 
    return true; // успешное выполнение операции
}
 
// вывод стека на экран
template <typename T>
void Stack<T>::printStack()
{
    for (int ix = size - 1; ix >= 0; ix--)
        cout << "|" << setw(4) << stackPtr[ix] << endl;
}
 
template <typename T>
Stack<T> StackCombination(const Stack<T>& first, const Stack<T>& second)
{
    int size = first.size + second.size;
    Stack<T> stack = Stack<T>(size);
    int index = first.size;
    while (index != first.head)
    {
        index = index - 1;
        stack.push(first.array[index]);
    }
    index = second.size;
    while (index != second.head)
    {
        index = index - 1;
        stack.push(second.array[index]);
    }
    return stack;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.04.2020, 11:35
Ответы с готовыми решениями:

Несостыковка типов при объединении строк
Надо объеденить строки, хочу воспользоваться для этого функцией strcat(), но она возвращает указатель на char, присвоить чару я его не...

Удалить символ конца файла при объединении нескольких файлов
Как удалить символ конца файла при объединении нескольких файлов? #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

Реализую класс очередь с использованием двух стеков.ошибка итератор dequee is not dereferanceble
Реализую класс очередь с использованием двух стеков. Вот, все получается, только pop плохо работает.. ошибка итератор dequee is not...

44
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
22.04.2020, 16:13
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Annemesski Посмотреть сообщение
С одной стороны зализываешь, с другой рвется, короче как-то так должно быть
А зачем ты добавляешь/удаляешь из начала массива, первый элемент? Не проще ли то же самое делать с последним элементом?
0
 Аватар для Annemesski
2670 / 1333 / 479
Регистрация: 08.11.2016
Сообщений: 3,682
22.04.2020, 16:24
oleg-m1973, очевидно потому что стэк, и метод push, а не add. Я так понимаю что ТС выполняет задание чтобы разобраться что такое стэк - в моей реализации это наглядно показано. Конечно, понятное дело, оптимальнее добавлять в конец и переставлять указатель на верхушку, и забирать потом с конца, но это уже следующий уровень понимания.
0
0 / 0 / 0
Регистрация: 05.09.2019
Сообщений: 34
22.04.2020, 16:47  [ТС]
oleg-m1973, как пересчитать размер стека после объединения? То есть у меня первый стек изначально размерностью 5, удаляю из него 2 элемента, становится 3. Создаю новый стек размерностью 5. После выполнения merge выводится 5 элементов, а еще 3 пишутся Stack overflow. То есть проблема где то в push?
0
60 / 45 / 15
Регистрация: 06.03.2018
Сообщений: 202
22.04.2020, 16:49
Цитата Сообщение от Annemesski Посмотреть сообщение
template <typename T>
T Stack<T> :: pop()
{
if (size == 0) // стек пуст
{
cout << "Stack is empty";
return false;
}
for (int i = 1; i < size; i++)
stackPtr[i - 1] = stackPtr[i];
size--;
stackPtr[size] = 0; // удаляем элемент из стека
return true; // успешное выполнение операции
}
Нигде не ошиблись?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
22.04.2020, 16:56
Цитата Сообщение от stupidgirls Посмотреть сообщение
oleg-m1973, как пересчитать размер стека после объединения? То есть у меня первый стек изначально размерностью 5, удаляю из него 2 элемента, становится 3. Создаю новый стек размерностью 5. После выполнения merge выводится 5 элементов, а еще 3 пишутся Stack overflow. То есть проблема где то в push?
Покажи код
0
0 / 0 / 0
Регистрация: 05.09.2019
Сообщений: 34
22.04.2020, 16:59  [ТС]
oleg-m1973,
Так вызываю
C++
1
myStack.merge(myStack2);
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template <typename T>
bool Stack<T>::push(const T value)
{
    if (top == size) // стек полон
    {
        cout << "Stack overflow" << endl;
        return false; 
    }
    stackPtr[top] = value; // помещаем элемент в стек
    top++;
    return true; // успешное выполнение операции
}
 
template <typename T>
void Stack<T>::merge(Stack &src)
{
    while (!src.empty())
        push(src.pop());
}
0
 Аватар для Annemesski
2670 / 1333 / 479
Регистрация: 08.11.2016
Сообщений: 3,682
22.04.2020, 17:00
Цитата Сообщение от galeks1 Посмотреть сообщение
Нигде не ошиблись?
вроде нет, подскажите что не так?
Цитата Сообщение от stupidgirls Посмотреть сообщение
как пересчитать размер стека после объединения? То есть у меня первый стек изначально размерностью 5, удаляю из него 2 элемента, становится 3. Создаю новый стек размерностью 5. После выполнения merge выводится 5 элементов, а еще 3 пишутся Stack overflow. То есть проблема где то в push?
Проблема в max_size, вы объявили стек величиной 5, больше туда не влезет
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
22.04.2020, 17:01
Цитата Сообщение от stupidgirls Посмотреть сообщение
oleg-m1973,
Так вызываю
Весь код покажи
0
0 / 0 / 0
Регистрация: 05.09.2019
Сообщений: 34
22.04.2020, 17:02  [ТС]
oleg-m1973,
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
#pragma once
#include <iostream>
#include <iomanip>
using namespace std;
 
template <typename T>
class Stack
{
private:
    T *stackPtr; // указатель на стек
    int size; // размер стека
    const size_t max_size = 10;
    T top = 0; // вершина стека
public:
    Stack(int sz = 10);// по умолчанию размер стека равен 10 элементам
    ~Stack(); // деструктор
    bool push(const T); // поместить элемент в стек
    T pop(); // удалить из стека элемент
    bool empty() const;
    void merge(Stack &src);
    void printStack();
};
 
// конструктор
template <typename T>
Stack<T>::Stack(int s)
{
    size = s > 0 ? s : 10;   // инициализировать размер стека
    stackPtr = new T[size]; // выделить память под стек
}
 
// деструктор
template <typename T>
Stack<T>::~Stack()
{
    delete[] stackPtr; // удаляем стек
}
 
// элемент функция класса  Stack для помещения элемента в стек
// возвращаемое значение: true - операция успешно завершена, false - элемент в стек не добавлен
template <typename T>
bool Stack<T>::push(const T value)
{
    if (top == size) // стек полон
    {
        cout << "Stack overflow" << endl;
        return false; 
    }
    stackPtr[top] = value; // помещаем элемент в стек
    top++;
    return true; // успешное выполнение операции
}
 
// элемент функция класса  Stack для удаления элемента из стек
// возвращаемое значение: true - операция успешно завершена, false - стек пуст
template <typename T>
T Stack<T>::pop()
{
    if (top == 0) //cout << "Stack is empty" << endl;
        throw std::out_of_range("Stack is empty");
    return stackPtr[--top]; // удаляем элемент из стека
}
 
// вывод стека на экран
template <typename T>
void Stack<T>::printStack()
{
    for (int ix = top - 1; ix >= 0; ix--)
        cout << "|" << setw(4) << stackPtr[ix] << endl;
}
 
template <typename T>
bool Stack<T>::empty() const
{
    return top == 0;
}
 
template <typename T>
void Stack<T>::merge(Stack &src)
{
    while (!src.empty())
        push(src.pop());
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
22.04.2020, 17:13
Цитата Сообщение от stupidgirls Посмотреть сообщение
oleg-m1973, как пересчитать размер стека после объединения? То есть у меня первый стек изначально размерностью 5, удаляю из него 2 элемента, становится 3. Создаю новый стек размерностью 5. После выполнения merge выводится 5 элементов, а еще 3 пишутся Stack overflow. То есть проблема где то в push?
В общем, сделай функцию reserve, которая будет увеличивать размер стека
C++
1
2
3
4
5
6
7
8
9
10
11
12
template <typename T> 
void Stack<T>::reserve(int new_size)
{
    if (new_size <= size)
        return;
 
    T *data = new T[new_size];
    std::move(stackPtr, stackPtr + top, data);
    delete[] stackPtr;
    size = new_size;
    stackPtr = data;
}
Добавлено через 1 минуту
Тогда
C++
1
2
3
4
5
6
7
template <typename T>
void Stack<T>::merge(Stack &src)
{
    reserve(top + src.top);
    while (!src.empty())
        push(src.pop());
}
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
22.04.2020, 17:17
neither stupid nor girls ones

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
#include <iostream>
#include <cassert>
template<class ValueType, int MaxSize=1024>
class Stack
{
    public:
    size_t maxSize(){return MaxSize; };
    Stack()=default;
    Stack(const Stack&)=default;
 
    void push(const ValueType &val)
    {
            assert(currentIndex < MaxSize);
            topPtr[currentIndex++]=val;
    }
 
    ValueType pop()
    {
         assert(currentIndex== 0);
         return topPtr[currentIndex--] ;
    }
 
    Stack operator +(const Stack &rhs)
    {
        auto ind(currentIndex+rhs.currentIndex);
        assert(ind<MaxSize);
        Stack ret(*this);
        size_t i=0;
        while(i <rhs.currentIndex )
        {
            ret.push(rhs.topPtr[i++]);
        }
        return ret;
    }
    void show()
    {
        size_t i(0);
        while(i<currentIndex)std::cout<<topPtr[i++]<<' ';
    }
private:
ValueType topPtr[MaxSize];
size_t currentIndex=0;
};
 
int main()
{
    const int sz(4);
    int a[sz]={1,2,3,4};
    Stack<int>s1, s2;
    for(auto el:a)
    {
        s1.push(el);
        s2.push(el+sz);
    }
 
  Stack<int>s3=s1+s2;
  s1.show();
  std::cout<<std::endl;
  s2.show();
  std::cout<<std::endl;
  s3.show();
  std::cout<<std::endl;
 
return 0;
}
0
0 / 0 / 0
Регистрация: 05.09.2019
Сообщений: 34
22.04.2020, 17:31  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
В общем, сделай функцию reserve, которая будет увеличивать размер стека
Стал выдавать вот такую гадость. Поискал как исправить можно, было подобное, но не помогает(
C++
1
#define D_SCL_SECURE_NO_WARNINGS
Миниатюры
Ошибка при объединении стеков  
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
22.04.2020, 17:38
Цитата Сообщение от stupidgirls Посмотреть сообщение
Стал выдавать вот такую гадость. Поискал как исправить можно, было подобное, но не помогает(
Сделай в main, в самом начале, перед всеми include
C++
1
#define _SCL_SECURE_NO_WARNINGS 1
1
0 / 0 / 0
Регистрация: 05.09.2019
Сообщений: 34
22.04.2020, 17:42  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Сделай в main, в самом начале, перед всеми include
У меня main в одном файле, а все остальное в созданном классе. Ни в том, ни в другом не помогает
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
22.04.2020, 17:44
Цитата Сообщение от stupidgirls Посмотреть сообщение
У меня main в одном файле, а все остальное в созданном классе. Ни в том, ни в другом не помогает
Покажи файл, в котором main
0
0 / 0 / 0
Регистрация: 05.09.2019
Сообщений: 34
22.04.2020, 17:45  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Покажи файл, в котором main
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
#define _SCL_SECURE_NO_WARNINGS 1
#include "stdafx.h"
#include <iostream>
#include "Stack.h"
 
 
int main()
{
    setlocale(0, "Rus");
    Stack <int> myStack(5);
    // заполняем стек
    cout << "Заталкиваем элементы в стек: ";
    int ct = 0;
    while (ct++ != 5)
    {
        int temp;
        cin >> temp;
        myStack.push(temp);
    }
    myStack.printStack(); // вывод стека на экран
    cout << endl << "Удаляем два элемента из стека:" << endl;
 
    myStack.pop(); // удаляем элемент из стека
    myStack.pop(); // удаляем элемент из стека
    myStack.printStack(); // вывод стека на экран
 
    Stack <int> myStack2(5);
    cout << "Заталкиваем элементы в стек: ";
    ct = 0;
    while (ct++ != 5)
    {
        int temp;
        cin >> temp;
        myStack2.push(temp);
    }
    myStack2.printStack(); // вывод стека на экран
    myStack.merge(myStack2);
    myStack.printStack();
 
    system("pause");
    return 0;
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
22.04.2020, 17:55
В stdafx.h, в самом начале сделай

Добавлено через 7 минут
И сделай #include <algorithm> в Stack.h
1
0 / 0 / 0
Регистрация: 05.09.2019
Сообщений: 34
22.04.2020, 17:57  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
В stdafx.h, в самом начале сделай
помогло, спасибо

Тут выводится три стека: первый, первый минус 2 элемента и новый стек. Как получить в слиянии только два стека? Новый и любой из первых.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Stack<T>::reserve(int new_size) //функция для увеличения размера стека
{
    if (new_size <= size)
        return;
 
    T *data = new T[new_size];
    std::move(stackPtr, stackPtr + top, data);
    delete[] stackPtr;
    size = new_size;
    stackPtr = data;
}
 
void Stack<T>::merge(Stack &src)
{
    reserve(top + src.top);
    while (!src.empty())
        push(src.pop());
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
22.04.2020, 17:59
Цитата Сообщение от stupidgirls Посмотреть сообщение
Тут выводится три стека: первый, первый минус 2 элемента и новый стек. Как получить в слиянии только два стека? Новый и любой из первых.
В смысле, получить, на экран вывести?
0
0 / 0 / 0
Регистрация: 05.09.2019
Сообщений: 34
22.04.2020, 18:02  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
В смысле, получить, на экран вывести?
ну получается же, что в первый стек дописываем новый. А получилось многовато элементов
Миниатюры
Ошибка при объединении стеков  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.04.2020, 18:02
Помогаю со студенческими работами здесь

Задание диапазона ячеек при объединении (OLE-сервер Excel)
Добрый день. Столкнулась с такой проблемой: при работе с OLE-сервером Excel, при задании диапазона объединения ячеек, появилась...

При объединении таблиц SQL запросом, резко возрасло количество строк. Как бороться?
Доброго здоровья! Попытался связать SQL запросом, принадлежащим Query, 7 таблиц и вывести их в один DBGrid, по одному столбцу из каждой. 6...

Ошибка диска при объединении разделов
История такова, жыли были 2 раздела &quot;С&quot; и &quot;D&quot; оба под одной файловой системой, раздел &quot;D&quot; был пуст, а на &quot;С&quot; была сама...

Две таблицы в одном запросе, ошибка при объединении
Выдаёт ошибку при объединении , что делать? $result = mysql_query(&quot;SELECT * FROM `asd, marka` WHERE asd.mark_id = marka.id &quot;);

С помощью стеков найти сумму всех произведений чисел, взятых по одному из третьего и четвертого стеков
даны 4 стека. Два первых стека пусты, а в 2-х других находятся натуральные числа, причем, количество чисел в них одно и то же. С помощью...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru