Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

C/C++ стеки, классы

67K
19 мая 2011 года
Lacrista
7 / / 27.04.2011
Нужно написать функции удаления и добавления произвольного элемента в стеке.
как понимаю нужно вводить дополнительный стек, но не знаю как это сделать.
87
19 мая 2011 года
Kogrom
2.7K / / 02.02.2008
Да, для LIFO наверное так и есть. Для FIFO вероятно можно было бы сквозь себя прокрутить.
Предлагаю автору темы набросать какой-нибудь код на основе std::stack, чтобы можно было рассуждать более конкретно.
67K
19 мая 2011 года
Lacrista
7 / / 27.04.2011
Ну, сама программа такая:
Код:
#include <iostream>
#include <cstdlib>
using namespace std;

struct STACK {

    int info;
    STACK *next;

};


Вспомогательный

int Empty(STACK *pstack)
{

    if (pstack==NULL)
    return 0;
    else
    return 1;

}

void Add(STACK **pstack)
{

    STACK *tmp=new STACK;
    tmp->info=rand()%100;
    tmp->next=*pstack;
    *pstack=tmp;

}

void Move(STACK **pdopstack, STACK **pstack)
{

    STACK *tmp=*pdopstack;
    *pdopstack=(*pdopstack)->next;
    tmp->next=*pstack;
    *pstack=tmp;

}

void Del(STACK **pstack)
{

    STACK *tmp=*pstack;
    *pstack=(*pstack)->next;
    delete tmp;

}

void Show(STACK *pstack)
{

    STACK *tmp=pstack;
    while(tmp!=NULL)
    {
    cout << tmp->info << " ";
    tmp=tmp->next;
    }

}

void ClearAll(STACK **pstack)
{

    STACK *tmp;
    while(*pstack!=NULL)
    {
    tmp=*pstack;
    *pstack=(*pstack)->next;
    delete tmp;
    }

}

int main()
{

    setlocale(LC_ALL,"Russian");
    STACK *stack=NULL, *dopstack=NULL;
    int num;
    char otv, otv2;
    do
    {

        cout << "1. Добавление элементов в вершину стека" << endl
        << "2. Удаление элемента с вершины стека" << endl
        << "3. Вывод элементов основного стека" << endl
        << "4. Вывод элементов вспомогательного стека" << endl
        << "0. Выход" << endl;
        cout << " = ";
        cin >> otv;
        switch(otv)
        {

        case ‘1?:

            cout << endl << "1. Добавить новый элемент" << endl
            << "2. Добавить из вспомогательного стека" << endl;
            cout << " = ";
            cin >> otv2;
            switch(otv2)
            {
            case ‘1?:

                cout << endl << "Сколько элементов нужно добавить = " << endl;
                cin >> num;
                for (int i=0;i<num;i++)
                Add(&stack);
                cout << endl << "Элементы добавлены" << endl;
                break;

            case ‘2?:

                if (Empty(dopstack)==0)
                cout << endl << "Вспомогательный стек пуст" << endl;
                else
                {
                Move(&dopstack,&stack);
                cout << endl << "Элемент добавлен из вспомогательного стека в основной" << endl;
                }
                break;

            default:

                cout << endl << "Ошибка" << endl;
                break;

            }
            break;

        case ‘2?:

            cout << endl << "1. Удалить элемент" << endl
            << "2. Добавить в вспомогательный стек" << endl << " = ";
            cin >> otv2;
            switch(otv2)
            {
            case ‘1?:

                if (Empty(stack)==0)
                cout << endl << "Стек пуст" << endl;
                else
                {
                Del(&stack);
                cout << endl << "Элемент удален" << endl;
                }
                break;

            case ‘2?:

                if (Empty(stack)==0)
                cout << endl << "Стек пуст" << endl;
                else
                {
                Move(&stack,&dopstack);
                cout << endl << "Элемент добавлен в вспомогательный стек" << endl;
                }
                break;

            default:

                cout << endl << "Ошибка" << endl;
                break;

            }
            break;

        case ‘3?:

            if (Empty(stack)==0)
            cout << endl << "Стек пуст" << endl;
            else
            {
            cout << endl << "Элементы стека:" << endl;
            Show(stack);
            cout << endl;
            }
            break;

        case ‘4?:

            if (Empty(dopstack)==0)
            cout << endl << "Вспомогательный стек пуст" << endl;
            else
            {
            cout << endl << "Элементы вспомогательного стека:" << endl;
            Show(dopstack);
            cout << endl;
            }
            break;

        case ‘0?:

            ClearAll(&stack);
            ClearAll(&dopstack);
            break;

        default:

            cout << endl << "Ошибка" << endl;
            break;

        }

    }while(otv!=’0?);
    cin.get();

}


Тут вспомогательный стек, как бы является корзиной.
Учитель сказал переделать так, чтоб удаление и добавление было для произвольных элементов.
87
19 мая 2011 года
Kogrom
2.7K / / 02.02.2008
Цитата: Lacrista
Ну, сама программа такая


А, так у вас самописный стек. Так тут и не нужен второй стек. Тут надо добавить 2 функции: Insert(STACK **pstack, int index) и Erase(STACK **pstack, int index). Эти функции будут идти по стеку от начала до элемента с требуемым индексом и удалять его (соответственно, надо будет поправить указатель в предыдущем элементе). Как-то так.

67K
19 мая 2011 года
Lacrista
7 / / 27.04.2011
Можете написать пример, хотяб одной функции, чтоб совсем понятно стало
87
19 мая 2011 года
Kogrom
2.7K / / 02.02.2008
Я в код не очень вникал, да и мой совет превратит стек в список. Но могу порассуждать. Есть метод: Show, который обходит элементы с помощью while, а в новых методах надо будет обходить с помощью for до индекса, указанного в параметре функции. Далее, удаляем как в Del, только указываем не на начало, а на элемент, до которого дошли. Ну и надо будет предусмотреть аварийные ситуации, и возвращать какой-нибудь код ошибки.

Мне это не интересно реализовывать. А способ с перекладыванием в корзину нагляднее всё-таки показать на std::stack, то есть на библиотечном классе, подобие которого вы пытаетесь изобрести.
70K
10 декабря 2011 года
Настен
37 / / 13.10.2011
Привет всем!У меня есть базовый класс Base и 3 производных класса.Мне надо создать стек с элементами базового класса..
Код:
#include <iostream>
using namespace std;
class Base
{
protected:
    char * name;
    char * surname;
    int age;
    Base*next;
public:
Base()
{
    surname=new char [20];
    name=new char [20];
    age=0;

}
virtual void Print(){};
virtual void Input()const=0;
 ~Base()
 {
     delete name;
     delete surname;
 }
};
class Student:public Base
{
private:
    int coorse,group;
    int rate;
public:
    Student()
    {
        coorse=0;
        group=0;
        rate=0;
    }

~Student()
{
    delete name;
    delete surname;
}
void Print()
{
    cout<<name<<","<<surname<<","<<age<<","<<coorse<<","<<group<<","<<rate<<endl;
}
void Input()
{
    cout<<"Введите имя студента "<<endl;
    cin>>name;
    cout<<"Введите фамилию студента "<<endl;
    cin>>surname;
    cout<<"Введите возраст студента "<<endl;
    cin>>age;
    cout<<"Введите курс студента"<<endl;
    cin>>coorse;
    cout<<"Введите группу студента"<<endl;
    cin>>group;
    cout<<"Введите рейтинг студента"<<endl;
    cin>>rate;
}
};
class Teacher:protected Base
{
    char*post;
    float salary;
public:
Teacher()
{
    post=new char [20];
    salary=0;
}
~Teacher()
{
    delete name;
    delete surname;
    delete post;
}
void Print()
{
    cout<<name<<","<<surname<<","<<age<<","<<post<<","<<salary<<endl;
}
void Input()
{
    cout<<"Введите имя преподавателя: "<<endl;
    cin>>name;
    cout<<"Введите фамилию преподавателя: "<<endl;
    cin>>surname;
    cout<<"Введите возраст преподавателя: "<<endl;
    cin>>age;
    cout<<"Введите должность преподавателя: "<<endl;
    cin>>post;
    cout<<"Введите зарплату преподавателя:"<<endl;
    cin>>salary;
}
};
class Head:private Base
{
    char*chair;
public:
Head()
{
    chair = new char [20];
}
~Head()
{
    delete name;
    delete surname;
    delete chair;
}
void Print()
{
    cout<<name<<","<<surname<<","<<chair<<endl;
    cout<<"возраст"<<age<<endl;
}
void Input()
{
    cout<<"Введите имя заведующего кафедрой "<<endl;
    cin>>name;
    cout<<"Введите фамилию заведующего кафедрой "<<endl;
    cin>>surname;
    cout<<"Введите кафедру заведующего "<<endl;
    cin>>chair;
    cout<<"Введите возраст заведующего кафедрой "<<endl;
    cin>>age;
}
};
class Stack
{
    int d;
    Base*head;
public:
    Stack()
    {
        head=NULL;
    }
 
 void Push(Stack*top,int d)
 {..

Вот код моей программы без стека,я не знаю,как правильно создать и заполнить стек...Не могли б вы помочь!
14
13 декабря 2011 года
Phodopus
3.3K / / 19.06.2008
Какой стек-то нужен?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог