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

Стек, сделанный из динамического массива указателей на линейные массивы

13.03.2023, 14:07. Показов 243. Ответов 0

Author24 — интернет-сервис помощи студентам
Заранее скажу, что нужен именно такого типа стек, НЕ СТРУКТУРОЙ и именно с массивами.
Так вот, изначально длинна внешнего массива 2 (внутреннего постоянно 2). Если у нас кончается место, то я пересоздаю массив, добавляя туда новую строчку, переписываю туда данные со старого и записываю новые элементы. Первый раз он нормально добавляет новую строчку, а на 2 выдаёт ошибку по памяти.
(ошибка в функции Push в операторе else)

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
#include <iostream>
#define M 2
using namespace std;
 
 
void InitStack(int**& stack, int size, int& str, int& stb)//инициализация массива
{
    stack = new int* [size];
    for (int i = 0; i < size; i++)
    {
        stack[i] = NULL;
    }
    str = -1;
    stb = -1;
}
 
void Push(int**& stack, int& size, int x, int& str, int& stb)
{
    if (str == -1) // Создаём первый массив
    {
        stack[++str] = new int[M];
        stb = -1;
    }
    if ((str * M + stb + 1) < size * M) // Если место не закончилось, то добавляем
    {
 
        if (stb == M - 1) // Если в этом массиве кончилось место, переходим на новый
        {
            str += 1;
            stb = 0;
            stack[str] = new int[M];
        }
        else
        {
            stb++; // Иначе просто добавляем усуществующему 
        }
 
        stack[str][stb] = x; //Присваиваем элемент
    }
    else
    {
        int boofer_str = str;
        int** new_stack = new int* [size + 1];
        InitStack(new_stack, size + 1, str, stb);
 
        for (int k = 0; k <= size + 1; ++k)
        {
            new_stack[k] = new int[M];
        }
        for (int i = 0; i <= size + 1; ++i)
        {
            for (int j = 0; j <= M; ++j)
            {
                new_stack[i][j] = NULL;
            }
        }
 
        for (int i = 0; i < size; ++i)
        {
            for (int j = 0; j < M; ++j)
            {
                new_stack[i][j] = stack[i][j];
            }
        }
 
        for (int i = 0; i < size; i++)
        {
            delete[] stack[i];
        }
        delete[] stack;
 
        stack = new_stack;
        size += 1;
        str = boofer_str + 1;
        stb = 0;
        stack[str][stb] = x;
    }
}
void Pop()
{
 
}
void Show(int**& stack, int &size, int &str, int &stb)
{
    for (int i = 0; i < str * M + stb + 1; i++)
    {
        if ((i % M) == 0) { cout << endl; }
        cout << stack[(int)(i / M)][i % M] << "  ";
    }
    if (stack[0] == NULL)
    {
        cout <<  "Stack is empty" << endl;
    }
    cout << endl << str << "  " << stb << endl;
    cout << endl;
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int x{ 0 }, str, stb, size = 2;
    int** stack;
    InitStack(stack, size, str, stb);
 
    int num = -1;
    while (num != 4)
    {
        cout << "1 - Положить символ в стэк" << endl;
        cout << "2 - Взять символ из стэка" << endl;
        cout << "3 - Показать стэк" << endl;
        cout << "4 - Выход" << endl;
        cout << "Введите номер команды: ";
        cin >> num;
        switch (num)
        {
        case 1:
            cout << "Введите число: ";
            cin >> x;
            Push(stack, size, x, str, stb);
            break;
        case 2:
            Pop();
            break;
        case 3:
            Show(stack, size, str, stb);
            break;
        case 4:
            for (int i = 0; i < size; i++)
            {
                stack[i] = NULL;
            }
            for (int i = 0; i < 10; i++)
            {
                delete[] stack[i];
            }
            break;
        default:
            cout << "Неизвестная команда!" << endl;
            break;
        }
    } 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.03.2023, 14:07
Ответы с готовыми решениями:

Разработайте определение класса Stack, описывающего тип – «Стек». Стек создается на основе динамического массива
Добрый день уважаемые знатоки, помогите довести до ума программу Разработайте определение класса...

Сортировка динамического массива указателей
Собственно я написал шаблон класса, а там нужно сделать сортировку выбором. Как это сделать с...

Объявление динамического массива указателей
как объявить динамический массив указателей? я знаю что обычный динамический массив записывать,...

С++ Задача с использованием указателей и динамического массива
Удалить из массива целых чисел все нули. Сформировать два новых массива. В первый массив...

0
13.03.2023, 14:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.03.2023, 14:07
Помогаю со студенческими работами здесь

Освобождение динамического двумерного массива указателей
Доброго времени суток. Подскажите как правильно очистить память после вот такого выделения: ...

Стек на базе динамического массива
У меня есть стек на базе массива. Как его переделать в стек на базе динамического массива??? //...

Стек на основе динамического массива
Здраствуйте написал(будто бы) стек на основе динамического массива как теперь к нему обратится и...

Стек на основе динамического массива
Надо написать стек на основе динамического массива. Как выделить память под новый элемент? ...

Стек на основе динамического массива
Помогите плизз.... написать лабу на тему стек на основе динамического массива

Сортировка динамического массива методом выбора с использованием указателей
Помогите пожалуйста! Нужно сделать сортировку одномерного динамического массива размерностью N...

Ошибка при компиляции двумерного динамического массива указателей
Нужно создать двумерный динамический массив указателей собственного типа Building в классе City, но...


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

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

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