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

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

22.04.2020, 11:35. Показов 2864. Ответов 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
2692 / 1349 / 485
Регистрация: 08.11.2016
Сообщений: 3,739
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
2692 / 1349 / 485
Регистрация: 08.11.2016
Сообщений: 3,739
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
9007 / 4708 / 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)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru