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

С++ для начинающих

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

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

23.12.2010, 20:47. Просмотров 4065. Ответов 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++;
}
Не работает. Подскажите как?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.12.2010, 20:47     Стек на основе динамического массива
Посмотрите здесь:
Очередь на основе динамического массива C++
C++ Стек на основе массива
C++ Очередь на основе динамического (статического) массива
Список на основе одномерного динамического массива C++
Стек на основе статического массива C++
C++ Написать стек на основе одномерного массива
C++ Помогите реализовать стек на основе массива
Стек на основе массива, реализовать функцию resize C++
Создать стек целых чисел на основе статического массива. C++
Стек записи на основе статического массива типа запись C++
Стек на основе статического массива: вставить число, учитывая сортировку C++
Очередь на основе динамического массива. Изучение функций ввода/вывода в программном интерфейсе Win32 C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
2918 / 1347 / 134
Регистрация: 29.11.2010
Сообщений: 2,721
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     Стек на основе динамического массива
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru