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

Класс стек, рекурсия, - C++

Восстановить пароль Регистрация
 
Lennyy
0 / 0 / 0
Регистрация: 21.12.2011
Сообщений: 3
21.12.2011, 13:54     Класс стек, рекурсия, #1
задача - реализовать стек через класс, все основные функции со стеком, и самое главное, рекурсивную функцию, которая выводит стек в обратном порядке.

st.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
#ifndef ST_H_
#define ST_H_
 
class Stack
{
public:
 
    Stack();
    ~Stack();
    void push(void *data);
    void *pop();
    void print();
    void recurc();
 
private:
    typedef struct Element {
                struct Element *next;
                void *data;
            } Element;
 
            Element *top;
 
 
 
};
 
 
#endif
function_stek.cpp
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
#include <iostream>
#include "st.h"
using namespace std;
 
Stack::Stack() {
    top = NULL;
}
 
Stack::~Stack() {
    while(top) {
        Element *elm = top->next;
        delete top;
        top = elm;
    }
}
 
void Stack::push(void *data) {
    Element *elm = new Element;
    elm->data = data;
    elm->next = top;
    top = elm;
}
 
void *Stack::pop() {
    void *data;
    if(top == NULL) return data;
    data = top->data;
    Element *elm = top;
    top = elm->next;
    delete elm;
    return data;
}
 
void Stack::print() {
    Element *elm = top;
    while(elm) {
        cout << *(static_cast<int*>(elm->data)) << " " ;
        elm = elm->next;
    }
    cout << endl;
}
 
void Stack::recurc()
{
 
        if(    ){
            recurc(    );
            cout << *(static_cast<int *>(top->data)) << " ";
        }
    
 
 
    cout << endl;
 
}
main.cpp
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
#include <iostream>
#include "st.h"
using namespace std;
 
int main()
{
 
    Stack *st = new Stack;
    int n1 = 10;
    int n2 = 20;
    int n3 = 30;
    int n4 = 40;
    int n5 = 50;
    st->push(&n1);
    st->push(&n2);
    st->push(&n3);
    st->push(&n4);
    st->push(&n5);
    st->print();
    cout << *(static_cast<int*>(st->pop()))<< " poped\n";
    cout << *(static_cast<int*>(st->pop()))<< " poped\n";
    cout << "Print stack ";
    st->print();
    cout << "Recurc ";
    st->recurc();
    cout << endl;
}

Понимаю, что рекурсивную функцию надо делать с аргументами, тогда получается, что всё в .h надо в паблик? Или как ее сделать?

Спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2011, 13:54     Класс стек, рекурсия,
Посмотрите здесь:

C++ класс, реализующий стек
C++ Стек через класс
Класс стек что не так? C++
Класс Стек Stack. не работает класс исключений C++
Класс стек C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
21.12.2011, 14:23     Класс стек, рекурсия, #2
Нет метода для доступа к вершине стека.
recurc и print должны быть функциями, а не методами.
easybudda
21.12.2011, 14:57
  #3

Не по теме:

Цитата Сообщение от Lennyy Посмотреть сообщение
и самое главное, рекурсивную функцию, которая выводит стек в обратном порядке
Вот интересно, это кто же такие извращения придумывает? Стек и так в обратном порядке возвращает то, что в него помещают. Это типа очень хитрая очередь получится...

Lennyy
0 / 0 / 0
Регистрация: 21.12.2011
Сообщений: 3
22.12.2011, 09:39  [ТС]     Класс стек, рекурсия, #4
так
я тут по-другому сделала, но всё равно не работает(

st.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
#ifndef ST_H_
#define ST_H_
 
class Stack
{
public:
    typedef struct Element
    {
        void *data;
        struct Element *next;
    } Element;
 
 
 
    bool push(Element **top, void *data);
    bool createStack(Element **top);
    bool pop(Element **top, void **data );
    bool deleteStack(Element **top);
    void printStack(Element *top);
    void recurc(Element *top);
 
 
 
 
 
};
 
 
#endif



function_stek.cpp
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
#include <iostream>
#include "st.h"
using namespace std;
 
bool Stack::push(Element **top, void *data)
{
    Element *elem = new Element;
    if(!elem) return false;
 
    elem->data = data;
    elem->next = *top;
    *top = elem;
    return true;
}
 
bool Stack::createStack(Element **top)
{
    *top = NULL;
    return true;
}
 
bool Stack::pop(Element **top, void **data )
{
    Element *elem;
    if( !(elem = *top) ) return false;
 
    *data = elem->data;
    *top = elem->next;
    delete elem;
    return true;
}
 
bool Stack::deleteStack(Element **top)
{
    Element *elem;
    while(*top) {
        elem = (*top)->next;
        delete *top;
        *top = elem;
    }
    return true;
 
}
 
void Stack::printStack(Element *top)
{
    if(top==NULL) {
        cout << "Empty!" << endl;
    }
    Element *cur = top;
    while(cur) {
        cout << *(static_cast<int *>(cur->data)) << " ";
        cur = cur->next;
    }
    cout << endl << endl;
}
 
 
 
void Stack::recurc(Element*top)
    {
        if(top){
            recurc(top->next);
            cout << *(static_cast<int *>(top->data)) << " ";
        }
 
    }


main.cpp
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
#include <iostream>
#include "st.h"
using namespace std;
 
 
int main()
{
 
Element *head;
    Stack::createStack(&head);
    int n1 = 1, n2 = 2, n3 = 3, n4 = 4, n5 = 5;
    Stack::push(&head, &n1);
    Stack::push(&head, &n2);
    Stack::push(&head, &n3);
    Stack::push(&head, &n4);
    Stack::push(&head, &n5);
 
    Stack::printStack(head);
 
 
 
    cout << "recurc" << endl;
    Stack::recurc(head);
    cout << endl;
 
 
}
Проблема в 10-ой строчке в главное программе, head не определен.
как это исправить? в st.h есть же описание типа Element.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
22.12.2011, 13:21     Класс стек, рекурсия, #5
Stack::Element * head;

И повторюсь: ЭТО не стек. У стека есть метод top, для доступа к последнему добавленному элементу.

Добавлено через 49 секунд
Весть этоот код НЕ правильный.
C++
1
2
3
4
5
6
7
        Stack::createStack(&head);
 
        Stack::push(&head, &n1);
        Stack::push(&head, &n2);
        Stack::push(&head, &n3);
        Stack::push(&head, &n4);
        Stack::push(&head, &n5);
Lennyy
0 / 0 / 0
Регистрация: 21.12.2011
Сообщений: 3
23.12.2011, 15:31  [ТС]     Класс стек, рекурсия, #6
понятно, спасибо

но а как правильно будет?
я вообще понять не могу(
Yandex
Объявления
23.12.2011, 15:31     Класс стек, рекурсия,
Ответ Создать тему
Опции темы

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