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

C++

Войти
Регистрация
Восстановить пароль
 
SanychBY
38 / 45 / 1
Регистрация: 04.06.2013
Сообщений: 1,532
#1

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

09.05.2015, 23:22. Просмотров 302. Ответов 8
Метки нет (Все метки)

Доброго времени суток.
Решил написать ряд универсальных функций, которые бы работали со стеками на основе списков, а заодно разобраться с шаблонами (классов еще не проходили, поэтому все на структурах).
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 минут
Никто не подскажет?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2015, 23:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создание функции для работы со стеками по шаблону (C++):

Создание формул по шаблону - C++ Builder
Доброго времени суток, форумчане! Столкнулся с некой проблемой при реализации одной задачи. Ну пожалуй с задачи и начну: В общем суть...

Создание потоков для работы со строками - C++ Builder
Мне нужно много поточное приложение которое может отрыть текстовый файл и в разных потоках работать с этими строками но в каждом потоке...

Создание библиотеки для работы со стеками - C++
Есть задание &quot;разработать библиотеку для работы со структурой данных типа стек&quot; . Я создал 3 файла: первый &quot;stek.cpp&quot;, в котором содержится...

Создание шаблонной функции для работы с массивами разных типов данных - C++
Здравствуйте. Столкнулся со следующей проблемой: не могу написать шаблонную функцию подсчета суммы элементов в массиве между первым и...

Создание функций для работы с массивами - C++
Ситуация такая: Надо написать программу, которая создаст(первая функция), покажет(вторая функция) и вычислит среднее значение элементов......

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

8
Max Dark
шКодер самоучка
1841 / 1641 / 598
Регистрация: 09.10.2013
Сообщений: 3,664
Записей в блоге: 6
Завершенные тесты: 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;
}
1
SanychBY
38 / 45 / 1
Регистрация: 04.06.2013
Сообщений: 1,532
10.05.2015, 00:33  [ТС] #3
Cra3y, как это все без класса

Добавлено через 8 минут
И мои вопросы остались без ответа
0
Max Dark
шКодер самоучка
1841 / 1641 / 598
Регистрация: 09.10.2013
Сообщений: 3,664
Записей в блоге: 6
Завершенные тесты: 2
10.05.2015, 00:51 #4
Цитата Сообщение от SanychBY Посмотреть сообщение
как это все без класса
в смысле? а как же шаблонный class stack<type>?
Цитата Сообщение от SanychBY Посмотреть сообщение
И мои вопросы остались без ответа
если коротко, то у вас ошибки, тк в struct MS нет полей DATA и next
0
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");
}
Программа запускается. Пишу функцию извлечения.
0
Max Dark
шКодер самоучка
1841 / 1641 / 598
Регистрация: 09.10.2013
Сообщений: 3,664
Записей в блоге: 6
Завершенные тесты: 2
10.05.2015, 01:25 #6
в треугольных скобках указываются параметры шаблона
разные параметры создают разные типы данных - они входят в сигнатуру функции/типа
stek<MS> *ms = new (stek<MS>); - создание указателя ms на stek<MS> и выделение памяти под элемент типа stek<MS>
1
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 строчку Вашего кода, я совершенно не могу.
0
Max Dark
шКодер самоучка
1841 / 1641 / 598
Регистрация: 09.10.2013
Сообщений: 3,664
Записей в блоге: 6
Завершенные тесты: 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;
}
0
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;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2015, 11:31
Привет! Вот еще темы с ответами:

Создание библиотеки для работы с полиномами - C++
Необходимо реализовать библиотеку,которая позволяет работать с полиномами от одной переменной. К основным операциям относятся (+, - , * ,...

Создание класса для работы с денежными суммами - C++
Создать класс Money для работы с денежными суммами. Сумма должна быть представлена массивом, каждый элемент которого - десятичная цифра....

Создание программы для работы с текстовыми файлами - C++
Здравствуйте, я естественно новичок в C++, стал изучать этот язык для того, чтобы создать программу, которую хочу использовать в работе. ...

Создание записи TDate и функции для работы с ней - Pascal ABC
Описать тип TDate - запись с полями целого типа Day (день ) , Month (месяц) и Year (год ) - и функцию LeapYear (D) логического типа с...


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

Или воспользуйтесь поиском по форуму:
9
Yandex
Объявления
10.05.2015, 11:31
Ответ Создать тему
Опции темы

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