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

Стек на основе динамического массива

23.12.2010, 20:47. Показов 13407. Ответов 4
Метки нет (Все метки)

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

C++
1
2
3
4
5
6
7
8
template <typename T>
void Stack<T>::AddElem(T item)
{
    size++;
    mas[size] = new T[1];
    mas[top] = item;
    top++;
}
Не работает. Подскажите как?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2010, 20:47
Ответы с готовыми решениями:

Очередь на основе динамического массива
Помогите найти ошибку, по заданию надо записать в очередь данные из файла, а при записи...

Стек на основе массива
Банально: создать, добавить, удалить. Без своих &quot;написаний&quot; никак, дело в том, что впритык не...

Список на основе одномерного динамического массива
Добрый вечер! Кто может привести в пример структуру такого списка? (на основе одномерного...

Очередь на основе динамического (статического) массива
Задание следующее: Абстрактный класс (интерфейс) - это у меня очередь Дочерние/производные классы...

4
39 / 37 / 13
Регистрация: 27.12.2009
Сообщений: 73
23.12.2010, 21:17 2
Нельзя выделять память для каждого элемента массива. Память можно выделять только под указатели, т. е. тебе нужно реализовать аналог realloc (си) или использовать динамические структуры данных аля список.
0
2 / 2 / 0
Регистрация: 08.09.2010
Сообщений: 44
23.12.2010, 21:45  [ТС] 3
Цитата Сообщение от SashaPinsk Посмотреть сообщение
Нельзя выделять память для каждого элемента массива. Память можно выделять только под указатели, т. е. тебе нужно реализовать аналог realloc (си) или использовать динамические структуры данных аля список.
Это я понял и решил выделять память так:
C++
1
mas =(T*) malloc(size*sizeof(T))
Выделяет нормально, но как увеличить ее непонятно

C++
1
mas = (T*) realloc(mas, (size+1)*sizeof(T));
неработает, на всякий случай весь код:

stack.h
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
#include <iostream>
using namespace std;
 
template <typename T> class Stack
{
public:
    Stack(int _size):size(_size){mas =(T*) malloc(size*sizeof(T));  top = 0;}
    ~Stack(){free(mas); mas = NULL;}}
    int StackSize();
    void Push(T item);  //Помещаем элемент в стек
    T pop();    //Выталкиваем элемент из стека
    T AddElem(T item);
private:
    T* mas_temp;
    T* mas;
    int top;
    int size;
};
 
template <typename T>
int Stack<T>::StackSize()
{
    return size;
}
//Помещаем элемент в стек
template <typename T>
void Stack<T>::Push(T item)
{
    if(top >= size)
    {
        cout << "\nStack is full. \n";
        return;
    }
    mas[top] = item;
    top++;
}
 
//Выталкиваем элемент из стека
template <typename T>
T Stack<T>::pop()
{
    if(top <=0)
    {
        cout << "\nStack is empty.\n";
        return 0;
    }   
    top--;
    return mas[top];
}
 
//Добавляем елемент в стек
template <typename T>
T Stack<T>::AddElem(T item)
{
    int size;
    size = this->StackSize();
    mas = (T*) realloc(mas, (size+1)*sizeof(T));
    cout << this->StackSize() << endl;
    top++;
    return 0;
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "stack.h"
#include <iostream>
using namespace std;
 
int main()
{
    int i, size;
    Stack<int> st1(7);
    for (i = 0; i < 6; i++)
    {
        st1.Push(i + 5);
    }
    st1.AddElem(15);
    size = st1.StackSize();
    cout << size << endl;
    cout << "Elements from 1st stack" << endl;
    for (i = 0; i < size-1; i++)
        cout << st1.pop() << ' ';
    cout << "\n" << endl;
    return 0;
}
0
4425 / 2364 / 853
Регистрация: 29.11.2010
Сообщений: 5,239
23.12.2010, 21:49 4
Надо пересоздать полностью весь массив.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template <typename T>
void Stack<T>::AddElem(T item)
{
        size++;
        // наверно, тут должна быть еще какая-то проверка на 
        // необходимость изменения размера хранилища
        // вроде if (top >= size)
        // создается новый массив большего размера
        T* new_mas = new T[size];
        // копируется старый массив в новый
        for (int i = 0; i < size - 1; ++i)
               new_mas[i] = mas[i];
        // удаляется старый массив
        delete [] mas;
        // старый массив указывает на новый массив
        mas = new_mas;
        // дальше не очень понятно
        mas[top] = item;
        top++;
}
Добавлено через 1 минуту
Не смешивайте new и malloc.
1
2 / 2 / 0
Регистрация: 08.09.2010
Сообщений: 44
23.12.2010, 21:59  [ТС] 5
Ну я код поправил, работает
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2010, 21:59
Помогаю со студенческими работами здесь

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

Написать стек на основе одномерного массива
Пробую написать стек на основе одномерного массива. Скажите что не так делаю. #include...

Помогите реализовать стек на основе массива
помогите с задачачей по с++ 3. Реализуйте стек на основе массива.

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


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

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

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