Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.97
horrorman
2 / 2 / 0
Регистрация: 08.09.2010
Сообщений: 44
23.12.2010, 20:47     Стек на основе динамического массива #1
Надо написать стек на основе динамического массива.
Как выделить память под новый элемент?

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++;
}
Не работает. Подскажите как?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SashaPinsk
 Аватар для SashaPinsk
39 / 37 / 2
Регистрация: 27.12.2009
Сообщений: 73
23.12.2010, 21:17     Стек на основе динамического массива #2
Нельзя выделять память для каждого элемента массива. Память можно выделять только под указатели, т. е. тебе нужно реализовать аналог realloc (си) или использовать динамические структуры данных аля список.
horrorman
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;
}
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
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.
horrorman
2 / 2 / 0
Регистрация: 08.09.2010
Сообщений: 44
23.12.2010, 21:59  [ТС]     Стек на основе динамического массива #5
Ну я код поправил, работает
Yandex
Объявления
23.12.2010, 21:59     Стек на основе динамического массива
Ответ Создать тему
Опции темы

Текущее время: 23:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru