Добавил:
Uliminittion
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:1 курс различные лабы и их куски. Что-то полезное тут есть / LAB 3 STACKS
.cpp// 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 курс различные лабы и их куски. Что-то полезное тут есть