Скачиваний:
9
Добавлен:
03.11.2022
Размер:
17.11 Кб
Скачать
// LAB 3 STACKS.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdlib.h>

using namespace std;
// структура для стека
struct stack {
    float item; // число в ячейке стека
    stack* next; // указатель на следующий в стеке
};


//указатель на указатель чтобы изменять непосредственно наш стек в функции хотя и можно через просто указатель
void push(stack**, int);//добавить в стек 1
void take_items(stack**, stack**);//для задания
void stack_print(stack*);//вывод стека
void clear_stack(stack**);//очистка стека
void new_stack_random_safe(stack**);//старый стек перезаписанный
void add_to_stack(stack**);//функция добавления нескольки элементов используя push
void arf_first(stack**);//задание 


stack* new_stack_random();//новый стек случайный
stack* new_stack();//новый стек


int main()
{
    setlocale(LC_ALL, "RU");
    stack* top1 = NULL;
    start:
    cout << "1. Создать новый стек " << endl;
    cout << "2. Просмотреть текущик стек " << endl;
    cout << "3. Очистить текущий стек " << endl;
    cout << "4. Случайно перезаполнить стек " << endl;
    cout << "5. Добавить в стек элементы " << endl;
    cout << "6. Выход" << endl;
    cout << "7. записать среднее знач. в вершину" << endl;
    int take = 0;
    cin >> take;
    int check;
    switch (take)
    {
    case 1: 
        if (top1 != NULL)
        {
            cout << "Стек уже создан" << endl;
            que1:
            cout << "Желаете продолжить?" << endl;
            cout << "1. Да" << endl;
            cout << "2. Нет" << endl;
            cin >> check;
            switch (check)
            {
            case 1:
                system("cls");
                goto start;
            case 2: return 0;
            default:
                system("cls");
                goto que1;
            }
        }
        else
        {
            top1 = new_stack();
            system("cls");
            goto start;
        }
    case 2:
 
        if (top1 == NULL)
        {
            cout << "Ваш стек пуст!" << endl;
            que2:
            cout << "Желаете продолжить?" << endl;
            cout << "1. Да" << endl;
            cout << "2. Нет" << endl;
            cin >> check;
            switch (check)
            {
            case 1:
                system("cls");
                goto start;
            case 2: return 0;
            default:
                system("cls");
                goto que2;
            }
        }
        else
        {
            cout << "Текущий стек:" << endl;
            stack_print(top1);
            que3:
            cout << "Желаете продолжить?" << endl;
            cout << "1. Да" << endl;
            cout << "2. Нет" << endl;
            cin >> check;
            switch (check)
            {
            case 1:
                system("cls");
                goto start;
            case 2: return 0;
            default:
                system("cls");
                goto que3;
            }
        }
    case 3:
        if (top1 == NULL)
        {
            cout << "Ваш стек и так пуст!" << endl;
            que4:
            cout << "Желаете продолжить?" << endl;
            cout << "1. Да" << endl;
            cout << "2. Нет" << endl;
            cin >> check;
            switch (check)
            {
            case 1:
                system("cls");
                goto start;
            case 2: return 0;
            default:
                system("cls");
                goto que4;
            }
        }
        else
        {
            que101:
            cout << "Вы точно хотите очистить стек?" << endl;
            cout << "1. Да" << endl;
            cout << "2. Нет" << endl;
            cin >> check;
            switch (check)
            {
            case 1:
                clear_stack(&top1);
                cout << "Ваш стек очищен!" << endl;
                que102:
                cout << "Желаете продолжить?" << endl;
                cout << "1. Да" << endl;
                cout << "2. Нет" << endl;
                cin >> check;
                switch (check)
                {
                case 1:
                    system("cls");
                    goto start;
                case 2: return 0;
                default:
                    system("cls");
                    goto que102;
                }
            case 2: 
                system("cls");
                return 0;
            default:
                system("cls");
                goto que101;
            }
            

        }
    case 4:
        if (top1 == NULL)
        {
            cout << "Вы не создали стек!" << endl;
            que6:
            cout << "Желаете создать и случайно заполнить?" << endl;
            cout << "1. Да" << endl;
            cout << "2. Нет" << endl;
            cin >> check;
            switch (check)
            {
            case 1:
                top1 = new_stack_random();
                system("cls");
                goto start;
            case 2: 
                que7:
                cout << "Желаете продолжить?" << endl;
                cout << "1. Да" << endl;
                cout << "2. Нет" << endl;
                cin >> check;
                switch (check)
                {
                case 1:
                    system("cls");
                    goto start;
                case 2: return 0;
                default:
                    system("cls");
                    goto que7;
                }
            default:
                system("cls");
                goto que6;
            }

        }
        else
        {
            new_stack_random_safe(&top1);
            cout << "Стек случайно перезаполнен" << endl;
            cout << "Желаете продолжить?" << endl;
            cout << "1. Да" << endl;
            cout << "2. Нет" << endl;
            cin >> check;
            switch (check)
            {
            case 1:
                system("cls");
                goto start;
            case 2: return 0;
            }
        }
    case 5:
        if (top1 == NULL)
        {
            cout << "Ваш стек пуст!" << endl;
            que8:
            cout << "Желаете добавить в стек элементы?" << endl;
            cout << "1. Да" << endl;
            cout << "2. Нет" << endl;
            cin >> check;
            switch (check)
            {
            case 1:
                add_to_stack(&top1);
                system("cls");
                goto start;
            case 2: 
                que9:
                cout << "Желаете продолжить?" << endl;
                cout << "1. Да" << endl;
                cout << "2. Нет" << endl;
                cin >> check;
                switch (check)
                {
                case 1:
                    system("cls");
                    goto start;
                case 2: return 0;
                default:
                    system("cls");
                    goto que9;
                }
            default:
                system("cls");
                goto que8;
            }
        }
        else
        {
            add_to_stack(&top1);
            system("cls");
            goto start;
            cout << "Элементы добавлены!" << endl;
            que10:
            cout << "Желаете продолжить?" << endl;
            cout << "1. Да" << endl;
            cout << "2. Нет" << endl;
            cin >> check;
            switch (check)
            {
            case 1:
                system("cls");
                goto start;
            case 2: return 0;
            default:
                system("cls");
                goto que10;
            }
        }
    
    case 6:
        que13:
        cout << "Вы уверены, что хотите выйти?" << endl;
        cout << "1. Да" << endl;
        cout << "2. Нет" << endl;
        cin >> check;
        switch (check)
        {
        case 1:
            clear_stack(&top1);
            return 0;
        case 2:
            system("cls");
            goto start;
        default:
            system("cls");
            goto que13;
        }
    case 7:
    
        if (top1 == NULL)
        {
            cout << "Ваш стек пуст!" << endl;
            que14:
            cout << "Желаете продолжить?" << endl;
            cout << "1. Да" << endl;
            cout << "2. Нет" << endl;
            cin >> check;
            switch (check)
            {
            case 1:
                system("cls");
                goto start;
            case 2: return 0;
            default:
                system("cls");
                goto que14;
            }
        }
        else
        {
            cout << "Ваш результат" << endl;
            arf_first(&top1);
            que17:
            cout << "Вы уверены, что хотите выйти?" << endl;
            cout << "1. Да" << endl;
            cout << "2. Нет" << endl;
            cin >> check;
            switch (check)
            {
            case 1:
                clear_stack(&top1);
                return 0;
            case 2:
                system("cls");
                goto start;
            default:
                system("cls");
                goto que17;
            }


        }

    default:
        system("cls");
        goto start;


    }

}

void clear_stack(stack** top)
{
    stack* next = *top;
    while (*top != NULL)
    {
        next = (*top)->next;
        (*top)->item = NULL;
        (*top)->next = NULL;
        free(*top);
        *top = next;

    }
}
void new_stack_random_safe(stack** top)
{
    stack* start = *top;
    ;stack* q = *top;
    int low = -10;
    int high = 10
    srand(time(0));
    while (q!= NULL)
    {
        q->item = rand() % (high - low + 1) + low;
        q = (*top)->next;
        *top = q;
    }
    *top = start;
}
stack* new_stack_random()
{
    stack* top = NULL;
    int z;
    cout << "Введите количесвто элементов в стеке " << endl;
    int n = 0;
    int low = -10;
    int high = 10;
    cin >> n;
    srand(time(0));
    for (int i = 0; i < n; i++)
    {
        z = rand() % (high - low + 1)+low;
        push(&top, z);
    }
    return top;
}

void add_to_stack(stack** top)
{
    int z;
    cout << "Введите количество новых элементов!" << endl;
    int n;
    cin >> n;
    cout << "Введите ваши элементы!" << endl;
    for (int i = 0; i < n; i++)
    {
        cin >> z;
        push(top, z);
    }
}
stack* new_stack()
{
    stack* top = NULL;
    int z;
    cout << "Введите количесвто элементов в стеке " << endl;
    int n = 0;
    cin >> n;
    cout << "Введите любые отрицательные и положительные элементы" << endl;
    for (int i = 0; i < n; i++)
    {
        cin >> z;
        push(&top, z);//ввод стека
    }
    return top;
}
void push(stack** top, int d) { //указатель на указатель нужен чтобы менять вершину в main(top)
    stack* q; //нвоый указатель на структуру stack или же есть новый элемент
    q = new stack(); // выделяю память
    q->item = d; // записываю в stack:a Значение d
    if (top == NULL) // если вершина null тоесть пуста
    {
        *top = q; // тогда указатель на вершину есть q
    }
    else
    {
        q->next = *top; // иначе мы присваем указателю в структуре указатель на top
        *top = q; // а сам q становиться новой вершиной
    }
}
void take_items(stack** top, stack** top1) { // разбиваем на 2 стека
    stack* q = *top; // cоздаю новый указатель который есть вершина стека
    stack* prev = NULL; //новый пустой указатель на предыдущий эл. стека Null чтобы если их нет не париться
    while (q != NULL)
    {
        if (q->item < 0) 
        {
            if (q == *top) // если вершина стека
            {
                push(top1, q->item); // добавляем во второй стек эл.
                *top = q->next; // обновляем вершину
                q->item = NULL;
                prev = q; //предыдущий теперь q
                q->next = NULL;
                delete q;
                q = *top; // следующая в стеке
            }
            else // если что угодно не не вершина стека
            {
                prev->next = q->next; // делаю замену, тем самым обходя q
                push(top1, q->item); // добавляем во второй стек эл.
                q->item = NULL;

                q->next = NULL;
                delete q;
                q = prev; // следующий в стеке

            }
        }
        else
        {
            prev = q; //если item > 0 то переходи на следующий в стеке
            q = q->next;
        }

    }
}

void arf_first(stack** top)
{
    stack* q = *top;
    int x = 0;
    int sum = 0;
    float arf = 0.0;
    while (q != NULL)
    {
        x += 1;
        sum += q->item;
        q = q->next;
    }
    arf =sum / float(x);
    cout << arf<<endl;
    (*top)->item = arf;
    cout << (*top)->item << " адрес: " << (*top) << " следующий адрес: " << (*top)->next << endl;
    stack_print((*top)->next);
}
void stack_print(stack* top) //вывод в консоль
{
    stack* q = top; //указатель на вершину стека непосредственно внутри функции
    int i = 0;
    while (q) // пока есть что-то в стеке
    {
        cout << int(q->item) << " адрес: " << q << " следующий адрес: " << q->next << endl; //вывод
        i++;
        q = q->next;
    }
    cout << endl;
}




// Запуск программы: CTRL+F5 или меню "Отладка" > "Запуск без отладки"
// Отладка программы: F5 или меню "Отладка" > "Запустить отладку"

// Советы по началу работы 
//   1. В окне обозревателя решений можно добавлять файлы и управлять ими.
//   2. В окне Team Explorer можно подключиться к системе управления версиями.
//   3. В окне "Выходные данные" можно просматривать выходные данные сборки и другие сообщения.
//   4. В окне "Список ошибок" можно просматривать ошибки.
//   5. Последовательно выберите пункты меню "Проект" > "Добавить новый элемент", чтобы создать файлы кода, или "Проект" > "Добавить существующий элемент", чтобы добавить в проект существующие файлы кода.
//   6. Чтобы снова открыть этот проект позже, выберите пункты меню "Файл" > "Открыть" > "Проект" и выберите SLN-файл.
Соседние файлы в папке 1 курс различные лабы и их куски. Что-то полезное тут есть