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

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

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

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

23.12.2010, 20:47. Просмотров 4193. Ответов 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++):

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

Стек на основе массива - C++
Банально: создать, добавить, удалить. Без своих &quot;написаний&quot; никак, дело в том, что впритык не хочет реагировать на &quot;next&quot;! #include...

Список на основе одномерного динамического массива - C++
Добрый вечер! Кто может привести в пример структуру такого списка? (на основе одномерного динамического массива) без использования...

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

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

Написать стек на основе одномерного массива - C++
Пробую написать стек на основе одномерного массива. Скажите что не так делаю. #include &lt;iostream.h&gt; #include &lt;conio.h&gt; #include...

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

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

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

Создать стек целых чисел на основе статического массива. - C++
Создать стек целых чисел на основе статического массива. Реализовать методы : Добавить элемент, удалить элемент, вершина стека. На...

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


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

Или воспользуйтесь поиском по форуму:
5
Yandex
Объявления
23.12.2010, 21:59
Ответ Создать тему
Опции темы

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