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

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

22.04.2020, 11:35. Показов 2506. Ответов 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, 13:32
Цитата Сообщение от stupidgirls Посмотреть сообщение
Пишет кучу ошибок: friend не разрешается для объявления данных; StackCombination переопределение, предыдущим определением было "переменная данных"; в ближайшей области пространства имен не удалось найти дружественное объявление.
Убери там <T>
C++
1
friend Stack StackCombination(const Stack& first, const Stack& second);
Добавлено через 5 минут
Цитата Сообщение от stupidgirls Посмотреть сообщение
Стек создаю, push и pop работают, но не понимаю, как сделать максимальный размер стека.
size - это и есть максимальный размер стека. Тогда top - это количество элементов в стеке
C++
1
2
3
4
5
6
template <typename T>
Stack<T>::Stack(int s)
{
    size = s > 0 ? s : 10;   // инициализировать размер стека
    stackPtr = new T[size]; // выделить память под стек
    top = 0;
1
 Аватар для Annemesski
2676 / 1337 / 481
Регистрация: 08.11.2016
Сообщений: 3,703
22.04.2020, 13:35
Как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template <typename T>
class Stack
{
private:
    T *stackPtr; // указатель на стек
    int size; // размер стека
    const size_t max_size;
    T top; // вершина стека
public:
    Stack(int sz = 10) : max_size(sz) {};// по умолчанию максимальный размер стека равен 10 элементам
    ~Stack(); // деструктор
    bool push(const T); // поместить элемент в стек, а тут если метод вызван когда size == max_size сделать cout << "STACK OVERFLOW" и retrun false
    bool pop(); // удалить из стека элемент
    void printStack();
    friend Stack StackCombination<T>(const Stack<T>& first, const Stack<T>& second);
};
1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
22.04.2020, 13:39
Лучший ответ Сообщение было отмечено stupidgirls как решение

Решение

Цитата Сообщение от stupidgirls Посмотреть сообщение
И еще не получается объединение стеков.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <typename T>
T Stack<T>::pop()
{
    if (top == 0)
        throw std::out_of_range("Stack is empty!");
 
    return stackPtr[--top]; // удаляем элемент из стека
}
 
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());
}
1
0 / 0 / 0
Регистрация: 05.09.2019
Сообщений: 34
22.04.2020, 14:45  [ТС]
Выдает ошибку: шаблон функции уже определен (где конструктор). И ошибка объявления самого стека. Я неправильно определяю?
Раньше вызов функции выглядел так. А теперь как будет?
C++
1
Stack <int> myStack(10);
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
template <typename T>
class Stack
{
private:
    T *stackPtr; // указатель на стек
    int size; // размер стека
    const size_t max_size;
    T top; // вершина стека
public:
    Stack(int sz = 10) : max_size(sz) {};// по умолчанию размер стека равен 10 элементам
    ~Stack(); // деструктор
    T 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]; // выделить память под стек
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
22.04.2020, 14:48
Цитата Сообщение от stupidgirls Посмотреть сообщение
Выдает ошибку: шаблон функции уже определен (где конструктор). И ошибка объявления самого стека. Я неправильно определяю?
Раньше вызов функции выглядел так. А теперь как будет?
Цитата Сообщение от stupidgirls Посмотреть сообщение
Stack(int sz = 10) : max_size(sz) {};// по умолчанию размер стека равен 10 элементам
C++
1
Stack(int sz = 10); ///// : max_size(sz) {};// по умолчанию размер стека равен 10 элементам
1
0 / 0 / 0
Регистрация: 05.09.2019
Сообщений: 34
22.04.2020, 15:17  [ТС]
Я дико извиняюсь, но я вообще не понимаю в чем проблема
Выдает вот такую штуку

Вот так вызываю функцию (тут пока без объединения стеков)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main()
{
    setlocale(0, "Rus");
    Stack <int> myStack(10);
    // заполняем стек
    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(); // вывод стека на экран
 
    system("pause");
    return 0;
}
Миниатюры
Ошибка при объединении стеков  
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
22.04.2020, 15:23
Цитата Сообщение от stupidgirls Посмотреть сообщение
Я дико извиняюсь, но я вообще не понимаю в чем проблема
Покажи весь код

C++
1
2
3
4
5
6
7
8
9
template <typename T>
Stack<T>::Stack(int s)
{
 
top = 0;
 
    size = s > 0 ? s : 10;   // инициализировать размер стека
    stackPtr = new T[size]; // выделить память под стек
}
0
0 / 0 / 0
Регистрация: 05.09.2019
Сообщений: 34
22.04.2020, 15:27  [ТС]
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
#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; // вершина стека
public:
    Stack(int sz = 10);// по умолчанию размер стека равен 10 элементам
    ~Stack(); // деструктор
    T 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>
T Stack<T>::push(const T value)
{
    if (size == max_size) // стек полон
    {
        cout << "Stack overflow" << endl;
        return false; 
    }
    size++;
    stackPtr[size] = value; // помещаем элемент в стек
    return true; // успешное выполнение операции
}
 
// элемент функция класса  Stack для удаления элемента из стек
// возвращаемое значение: true - операция успешно завершена, false - стек пуст
template <typename T>
T Stack<T>::pop()
{
    if (size == 0) // стек пуст
    {
        cout << "Stack is empty";
        return false; 
    }
    stackPtr[size] = 0; // удаляем элемент из стека
    size--;
    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>
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, 15:31
stupidgirls, во-первых top проинициализируй нулём, во-вторых - зачем ты переделал push и pop на size?

Добавлено через 55 секунд
В третьих - я тебе разве такую функцию pop() показывал?
0
0 / 0 / 0
Регистрация: 05.09.2019
Сообщений: 34
22.04.2020, 15:39  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
В третьих - я тебе разве такую функцию pop() показывал?
Так вылазит out of range
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
#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(); // деструктор
    T 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>
T Stack<T>::push(const T value)
{
    if (size == max_size) // стек полон
    {
        cout << "Stack overflow" << endl;
        return false; 
    }
    size++;
    stackPtr[top] = value; // помещаем элемент в стек
    return true; // успешное выполнение операции
}
 
// элемент функция класса  Stack для удаления элемента из стек
// возвращаемое значение: true - операция успешно завершена, false - стек пуст
template <typename T>
T Stack<T>::pop()
{
    if (top == 0)
        throw std::out_of_range("Stack is empty!");
 
    return stackPtr[--top]; // удаляем элемент из стека
}
 
// вывод стека на экран
template <typename T>
void Stack<T>::printStack()
{
    for (int ix = size - 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
 Аватар для Annemesski
2676 / 1337 / 481
Регистрация: 08.11.2016
Сообщений: 3,703
22.04.2020, 15:42
C++
1
2
3
4
5
6
template <typename T>
Stack<T>::Stack(int s) : max_size(s), size = 0
{
//    size = s > 0 ? s : 10;   // инициализировать размер стека
    stackPtr = new T[max_size]; // выделить память под стек
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <typename T>
T Stack<T>::push(const T value)
{
    if (size == max_size) // стек полон
    {
        cout << "Stack overflow" << endl;
        return false; 
    }
    size++;
    for (int i = size; i > 0; i--)
        stackPtr[i] = stackPtr[i - 1]
    stackPtr[0] = value; // помещаем элемент в стек
    return true; // успешное выполнение операции
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
22.04.2020, 15:43
Цитата Сообщение от stupidgirls Посмотреть сообщение
Так вылазит out of range
size - это размер массива, выделенного под стек. Он присваивается в конструкторе и больше не меняется.
top - количество элементов в стеке, он увеличивается в push и уменьшается в pop
1
 Аватар для Annemesski
2676 / 1337 / 481
Регистрация: 08.11.2016
Сообщений: 3,703
22.04.2020, 15:49
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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; // успешное выполнение операции
}
Добавлено через 2 минуты
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
top - количество элементов в стеке
У него top объявлен как template-type, только ТС его вообще нигде не применяет, что странно.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
22.04.2020, 15:52
Цитата Сообщение от Annemesski Посмотреть сообщение
У него top объявлен как template-type, только ТС его вообще нигде не применяет, что странно.
Посмотри самый первый пост. Он там его использует как индекс последнего элемента, просто ошибся с типом.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
22.04.2020, 15:52
Цитата Сообщение от stupidgirls Посмотреть сообщение
C++
1
2
3
size++;
 stackPtr[top] = value; // помещаем элемент в стек
 return true; // успешное выполнение операции
C++
1
 stackPtr[size++] = value;
что-то лишнее top или size. Но то что останется и нужно инкрементировать. А у вас top не изменилось.
Цитата Сообщение от stupidgirls Посмотреть сообщение
В случае переполнения стека должно выходить сообщение об ошибке.
То же касается и попытки вытолкнуть из пустого стека что-то по невалидному адресу (меньше начального).
0
0 / 0 / 0
Регистрация: 05.09.2019
Сообщений: 34
22.04.2020, 15:53  [ТС]
oleg-m1973, спасибо, про size и top понятно стало, в pop и push поставил top. Вроде более менее, но если ввожу 1 2 3 4 5 6 7 8 9 10, то в стек добавляются только 1 2 3 4 5, остальные -842150451

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
#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(); // деструктор
    T 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]; // выделить память под стек
    top = -1;
}
 
// деструктор
template <typename T>
Stack<T>::~Stack()
{
    delete[] stackPtr; // удаляем стек
}
 
// элемент функция класса  Stack для помещения элемента в стек
// возвращаемое значение: true - операция успешно завершена, false - элемент в стек не добавлен
template <typename T>
T Stack<T>::push(const T value)
{
    //if (size == max_size) // стек полон
    //{
    //  cout << "Stack overflow" << endl;
    //  return false; 
    //}
    top++;
    stackPtr[top] = value; // помещаем элемент в стек
    return true; // успешное выполнение операции
}
 
// элемент функция класса  Stack для удаления элемента из стек
// возвращаемое значение: true - операция успешно завершена, false - стек пуст
template <typename T>
T Stack<T>::pop()
{
    if (top == 0)
        throw std::out_of_range("Stack is empty!");
 
    return stackPtr[--top]; // удаляем элемент из стека
}
 
// вывод стека на экран
template <typename T>
void Stack<T>::printStack()
{
    for (int ix = size - 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, 15:59
Цитата Сообщение от stupidgirls Посмотреть сообщение
oleg-m1973, спасибо, про size и top понятно стало, в pop и push поставил top. Вроде более менее, но если ввожу 1 2 3 4 5 6 7 8 9 10, то в стек добавляются только 1 2 3 4 5, остальные -842150451
C++
1
2
3
4
5
6
7
8
9
10
11
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; // успешное выполнение операции
}
Добавлено через 1 минуту
Цитата Сообщение от stupidgirls Посмотреть сообщение
template <typename T>
Stack<T>::Stack(int s)
{
    size = s > 0 ? s : 10;   // инициализировать размер стека
    stackPtr = new T[size]; // выделить память под стек
    top = -1;
}
Убери здесь top = -1;

Добавлено через 1 минуту
top - это количество элементов, если он равен нулю, то стек пустой, если равен size, то полный

Добавлено через 41 секунду
C++
1
2
3
4
5
6
7
// вывод стека на экран
template <typename T>
void Stack<T>::printStack()
{
    for (int ix = top - 1; ix >= 0; ix--)
        cout << "|" << setw(4) << stackPtr[ix] << endl;
}
0
0 / 0 / 0
Регистрация: 05.09.2019
Сообщений: 34
22.04.2020, 15:59  [ТС]
oleg-m1973, я ступил, ошибка в вызове функции была.
0
 Аватар для Annemesski
2676 / 1337 / 481
Регистрация: 08.11.2016
Сообщений: 3,703
22.04.2020, 16:08
С одной стороны зализываешь, с другой рвется, короче как-то так должно быть
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 <iostream>
#include <iomanip>
using namespace std;
 
template <typename T>
class Stack
{
private:
    T *stackPtr; // указатель на стек
    int size; // размер стека
    const size_t max_size;
    T *m_top; // вершина стека
public:
    Stack(unsigned int = 10);// по умолчанию размер стека равен 10 элементам
    ~Stack(); // деструктор
    T push(const T &); // поместить элемент в стек
    T pop(); // удалить из стека элемент
    T top(); // получить значение верхнего элемента стека
    bool empty() const;
    void merge(Stack &src);
    void printStack();
};
 
// конструктор
template <typename T>
Stack<T>::Stack(unsigned int s) : max_size(s), size(0)
{
//  size = s > 0 ? s : 10;   // инициализировать размер стека
    stackPtr = new T[size]; // выделить память под стек
    m_top = &stackPtr[0];
}
 
// деструктор
template <typename T>
Stack<T>::~Stack()
{
    delete[] stackPtr; // удаляем стек
}
 
// элемент функция класса  Stack для помещения элемента в стек
// возвращаемое значение: true - операция успешно завершена, false - элемент в стек не добавлен
template <typename T>
T Stack<T>::push(const T &value)
{
    if (size == max_size) // стек полон
    {
        cout << "Stack overflow" << endl;
        return false;
    }
    size++;
    for (int i = size; i > 0; i--)
        stackPtr[i] = stackPtr[i - 1];
    stackPtr[0] = value; // помещаем элемент в стек
    
    return true; // успешное выполнение операции
}
 
// элемент функция класса  Stack для удаления элемента из стек
// возвращаемое значение: true - операция успешно завершена, false - стек пуст
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; // успешное выполнение операции
}
 
template <typename T>
T Stack<T>::top()
{
    T ret;
    if (empty())
        cout << "Stack is empty" << endl;
    else
        ret = *m_top;
    return ret;
}
 
// вывод стека на экран
template <typename T>
void Stack<T>::printStack()
{
    for (int ix = 0; ix < size; ix++)
        cout << "|" << setw(4) << stackPtr[ix] << endl;
}
 
template <typename T>
bool Stack<T>::empty() const
{
    return size == 0;
}
 
template <typename T>
void Stack<T>::merge(Stack &src)
{
    while (!src.empty())
        push(src.pop());
}
 
int main()
{
    setlocale(0, "Rus");
    Stack <int> myStack(10);
    // заполняем стек
    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(); // вывод стека на экран
 
    system("pause");
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.04.2020, 16:08
Помогаю со студенческими работами здесь

Задание диапазона ячеек при объединении (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-х других находятся натуральные числа, причем, количество чисел в них одно и то же. С помощью...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru