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

Создание функции для работы со стеками по шаблону - C++

Восстановить пароль Регистрация
 
SanychBY
 Аватар для SanychBY
38 / 45 / 1
Регистрация: 04.06.2013
Сообщений: 1,532
09.05.2015, 23:22     Создание функции для работы со стеками по шаблону #1
Доброго времени суток.
Решил написать ряд универсальных функций, которые бы работали со стеками на основе списков, а заодно разобраться с шаблонами (классов еще не проходили, поэтому все на структурах).
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
template <typename T>struct stek
{
    T *Head;
    stek()
    {
        Head = NULL;
    }
    ~stek()
    {
 
    }
    void *DATA;
    T *next;
    void push(void *q);
};
 
template <typename T> void stek<T>::push(void *q)
{
    T *t = new (T);
    if (!t)
    {
        cout << "Not enough memory!" << endl;
        exit(0);
    }
    t->DATA = q;
    if (this->Head)
    {
        t->next = this->Head;
    }
    else
    {
        t->next = NULL;
    }
    this->Head = t;
}
 
struct MS
{
 
};
 
void main()
{
    int c = 123;
    stek<MS> *ms = new (stek<MS>);
    ms->push(&c);
    system("pause");
Выдает ошибку
Ошибка 1 error C2039: DATA: не является членом "MS"
Ошибка 2 error C2039: next: не является членом "MS"
Ошибка 3 error C2039: next: не является членом "MS"

Поясните пожалуйста stek<T> и stek<MS> *ms = new (stek<MS>);
Благодарю.

Добавлено через 1 час 36 минут
Никто не подскажет?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2015, 23:22     Создание функции для работы со стеками по шаблону
Посмотрите здесь:

Создание класса для работы с дробями C++
C++ Функции для работы с массивами
Создание функций для работы с массивами C++
C++ Builder Создание потоков для работы со строками
Функции для работы с файлами C++ Linux
Создание шаблонной функции для работы с массивами разных типов данных C++
Создание программы для работы с текстовыми файлами C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Max Dark
В поиске работы
 Аватар для Max Dark
1547 / 1400 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
10.05.2015, 00:20     Создание функции для работы со стеками по шаблону #2
Вам нужна еще 1 структура - звено списка
примерно так
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <stdexcept>
#include <exception>
 
// стек на основе односвязного списка
template<class Type>
class stack {
public:
    typedef Type value_type; // тип значения
    typedef value_type& value_ref; // ссылка на элемент
    typedef const value_type& value_cref; // константная ссылка
private:
    // структура "звено"
    struct node {
        value_type value; // значение
        node* link;  // указатель на следующий
        // конструктор по умолчанию
        node():value(0),link(nullptr){}
        // конструктор с установкой значений
        node(value_cref val, node* prev):value(val),link(prev){}
    };
    node*  m_head; // голова стека
    size_t m_size; // кол-во значений
public:
    // конструктор по умолчанию
    stack():m_head(nullptr),m_size(0){}
    // деструктор
    ~stack() { clear(); }
    // проверка на пустоту
    bool is_empty() { return nullptr == m_head; }
    // возвращает кол-во значений
    size_t size() { return m_size; }
    // очистка стека
    void clear() {
        while(not is_empty()) {
            node* tmp = m_head;
            m_head = m_head->link;
            delete tmp;
        }
        m_size = 0;
    }
    // возвращает значение на верхушке стека
    value_ref top() {
        if(is_empty())
            throw std::runtime_error("stack is empty");
        return m_head->value;
    }
    // добавление элемента
    void push(value_cref value) {
        // создаем звено
        node* tmp = new node(value, m_head);
        if(!tmp)
            throw std::runtime_error("no memory");
        // запоминаем новую голову
        m_head = tmp;
        // увеличиваем счетчик
        ++m_size;
    }
    // удаляет верхний элемент
    void pop() {
        if(is_empty())
            throw std::runtime_error("stack is empty");
        // запоминаем голову
        node* tmp = m_head;
        // смещаемся к следующему
        m_head = m_head->link;
        // уменьшаем счетчик
        --m_size;
        // удаляем старую голову
        delete tmp;
    }
};
struct dummy {};
int main() {
    stack<dummy> st;
    st.push(dummy());
    return 0;
}
SanychBY
 Аватар для SanychBY
38 / 45 / 1
Регистрация: 04.06.2013
Сообщений: 1,532
10.05.2015, 00:33  [ТС]     Создание функции для работы со стеками по шаблону #3
Cra3y, как это все без класса

Добавлено через 8 минут
И мои вопросы остались без ответа
Max Dark
В поиске работы
 Аватар для Max Dark
1547 / 1400 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
10.05.2015, 00:51     Создание функции для работы со стеками по шаблону #4
Цитата Сообщение от SanychBY Посмотреть сообщение
как это все без класса
в смысле? а как же шаблонный class stack<type>?
Цитата Сообщение от SanychBY Посмотреть сообщение
И мои вопросы остались без ответа
если коротко, то у вас ошибки, тк в struct MS нет полей DATA и next
SanychBY
 Аватар для SanychBY
38 / 45 / 1
Регистрация: 04.06.2013
Сообщений: 1,532
10.05.2015, 00:54  [ТС]     Создание функции для работы со стеками по шаблону #5
Цитата Сообщение от Cra3y Посмотреть сообщение
если коротко, то у вас ошибки, тк в struct MS нет полей DATA и next
мне кратко не подходит, меня интересует, что такое stek<MS> *ms = new (stek<MS>); и stek<T>
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
template <typename T>
struct stek
{
    stek<T> *Head;
    stek()
    {
        Head = NULL;
    }
    ~stek()
    {
 
    }
    void *DATA;
    stek<T> *next;
    inline void push(void *q);
};
 
template <typename T> 
void stek<T>::push(void *q)
{
    stek<T> *t = new (stek<T>);
    if (!t)
    {
        cout << "Not enough memory!" << endl;
        exit(0);
    }
    t->DATA = q;
    if (this->Head)
    {
        t->next = this->Head;
    }
    else
    {
        t->next = NULL;
    }
    this->Head = t;
}
void main()
{
    int c = 123;
    stek<MS> *ms = new (stek<MS>);
    ms->push(&c);
    system("pause");
}
Программа запускается. Пишу функцию извлечения.
Max Dark
В поиске работы
 Аватар для Max Dark
1547 / 1400 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
10.05.2015, 01:25     Создание функции для работы со стеками по шаблону #6
в треугольных скобках указываются параметры шаблона
разные параметры создают разные типы данных - они входят в сигнатуру функции/типа
stek<MS> *ms = new (stek<MS>); - создание указателя ms на stek<MS> и выделение памяти под элемент типа stek<MS>
SanychBY
 Аватар для SanychBY
38 / 45 / 1
Регистрация: 04.06.2013
Сообщений: 1,532
10.05.2015, 01:44  [ТС]     Создание функции для работы со стеками по шаблону #7
Cra3y, мне Ваша идея с доп структурой очень понравилась, но у меня проблема инициализации в main
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
62
63
64
65
66
67
68
69
template <typename T>
struct stek
{
public:
    typedef T value_type; // тип значения
    typedef value_type& value_ref; // ссылка на элемент
    typedef const value_type& value_cref; // константная ссылка
private:
    int size;
    struct  node
    {
        void *data;
        node *next;
    };
    node *Head;
    stek()
    {
        size = 0;
        Head = NULL;
    }
    ~stek()
    {
 
    }
public:
    inline void push(void *q);//встроенная функция
    inline stek<T>* pop();
};
 
template <typename T> 
void stek<T>::push(void *q)
{
    node *t = new (node);
    if (!t)
    {
        cout << "Not enough memory!" << endl;
        exit(0);
    }
    t->data = q;
    if (this->Head)
    {
        t->next = this->Head;
    }
    else
    {
        t->next = NULL;
    }
    this->size++;
    this->Head = t;
}
 
template <typename T>
stek<T> *stek<T>::pop()
{
    return this->Head;
}
 
struct MS
{
 
};
void main()
{
    int c = 423;
    stek<MS> ms;//ругается
    ms.push((void*)c);
    //cout << (int)ms->DATA << endl;
    system("pause");
}
Честно говоря, понять 75 строчку Вашего кода, я совершенно не могу.
Max Dark
В поиске работы
 Аватар для Max Dark
1547 / 1400 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
10.05.2015, 01:49     Создание функции для работы со стеками по шаблону #8
Цитата Сообщение от SanychBY Посмотреть сообщение
Честно говоря, понять 75 строчку Вашего кода, я совершенно не могу.
там создается элемент типа dummy и запихивается в стек
можно переписать
C++
1
2
3
4
5
6
int main() {
    stack<dummy> st;
    dummy tmp;
    st.push(tmp);
    return 0;
}
вместо типа dummy можно использовать другие
допустим, double
C++
1
2
3
4
5
int main() {
    stack<double> st;
    st.push(4.2);
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2015, 11:31     Создание функции для работы со стеками по шаблону
Еще ссылки по теме:

Создание библиотеки для работы со стеками C++
Создание формул по шаблону C++ Builder
C++ Создание класса для работы с денежными суммами
C++ Создание библиотеки для работы с полиномами
Функции для работы с консолью C++ WinAPI

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

Или воспользуйтесь поиском по форуму:
SanychBY
 Аватар для SanychBY
38 / 45 / 1
Регистрация: 04.06.2013
Сообщений: 1,532
10.05.2015, 11:31  [ТС]     Создание функции для работы со стеками по шаблону #9
Вот что получилось
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#pragma once
 
using namespace std;
 
template <typename T>
struct stek
{
public:
    typedef T value_type; // тип значения
    typedef value_type& value_ref; // ссылка на элемент
    typedef const value_type& value_cref; // константная ссылка
private:
    int size;
    struct  node
    {
        void *data;
        node *next;
    };
    node *Head;
public:
    stek()
    {
        size = 0;
        Head = NULL;
    }
    ~stek()
    {
        Clear();
    }
    inline void Push(void *q);//встроенная функция
    inline void* Pop();
    inline void Clear();
    inline int SizeS();
};
 
template <typename T>
void stek<T>::Push(void *q)
{
    node *t = new (node);
    if (!t)
    {
        cout << "Not enough memory!" << endl;
        exit(0);
    }
    t->data = q;
    if (this->Head)
    {
        t->next = this->Head;
    }
    else
    {
        t->next = NULL;
    }
    this->size++;
    this->Head = t;
}
 
template <typename T>
void *stek<T>::Pop()
{
    void *d;
    if (this->Head)
    {
        d = this->Head->data;
        node *b = this->Head;
        this->Head = this->Head->next;
        delete b;
        this->size--;
    }
    return d;
}
 
template <typename T>
void stek<T>::Clear()
{
    while (this->Head)
    {
        node *t = this->Head;
        this->Head = this->Head->next;
        delete t;
        this->size = 0;
    }
}
 
template <typename T>
int stek<T>::SizeS()
{
    return this->size;
}
Yandex
Объявления
10.05.2015, 11:31     Создание функции для работы со стеками по шаблону
Ответ Создать тему
Опции темы

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