Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.97
horrorman
2 / 2 / 1
Регистрация: 08.09.2010
Сообщений: 44
#1

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

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

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

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

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

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

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

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

4
SashaPinsk
39 / 37 / 13
Регистрация: 27.12.2009
Сообщений: 73
23.12.2010, 21:17 #2
Нельзя выделять память для каждого элемента массива. Память можно выделять только под указатели, т. е. тебе нужно реализовать аналог realloc (си) или использовать динамические структуры данных аля список.
0
horrorman
2 / 2 / 1
Регистрация: 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
lemegeton
2933 / 1362 / 467
Регистрация: 29.11.2010
Сообщений: 2,725
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
horrorman
2 / 2 / 1
Регистрация: 08.09.2010
Сообщений: 44
23.12.2010, 21:59  [ТС] #5
Ну я код поправил, работает
0
23.12.2010, 21:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2010, 21:59
Привет! Вот еще темы с решениями:

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

Стек на основе массива, реализовать функцию resize
1) Добавить деструктор, конструктор копии и перегрузку операции присваивания....

Создать стек целых чисел на основе статического массива.
Создать стек целых чисел на основе статического массива. Реализовать методы :...

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


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

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

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