Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
113 changes: 113 additions & 0 deletions src/hw5_Sort_And_Queue/sortingStation.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
//
// Created by sasha on 23.10.2025.
//

#include "sortingStation.h"

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include "stack.h"

// Проверяем является ли данный нам символ знаком операции (умножения/деления/сложения/вычитания)
int isOperator(char currElem) {
return currElem == '+' || currElem == '-' || currElem == '*' || currElem == '/';
}

// Проверяем приоритет данного нам знака (по мат законам у деления/умножения он выше чем у сложения/вычитания)
int priority(char currElem) {
if (currElem == '+' || currElem == '-') {
return 1;
}
if (currElem == '*' || currElem == '/') {
return 2;
}
return 0;
}


// Само преобразованиие Дейкстры
void toPostfix(char infix[], char postfix[]) {
Stack stack;
init_stack(&stack);
int postfix_index = 0;

for (int i = 0; infix[i] != '\0'; i++) {
char currElem = infix[i];

// Пропускаем пробелы
if (currElem == ' ') {
continue;
}

// Если цифра - добавляем в массив postfix, так как числа идут первыми, а потом операции
if (isdigit(currElem)) {
postfix[postfix_index++] = currElem; // Добавляем число в следующий индекс массива
postfix[postfix_index++] = ' '; // Делаем пробелы между символами, чтоб не слипалось
}

// Если открывающая скобка, то в стек
else if (currElem == '(') {
push(&stack, currElem);
}

// Закрывающая скобка завершает выражение в скобках.
// Вынимаем из стека все операции пока не найдем открывающую скобку
else if (currElem == ')') {
while (!StackEmptiness(&stack)) {
char operator = pop(&stack);
if (operator == '(') {
break;
}
postfix[postfix_index++] = operator;
postfix[postfix_index++] = ' ';
}
}
// Если операция
else if (isOperator(currElem)) {
// Вынимаем операторы с более высоким или равным приоритетом, так как надо чтобы в выражениях, где важен порядок, они выполнялись быстрее
while (!StackEmptiness(&stack)) {
char lastOperator = stack.elements[stack.topIndex];
if (lastOperator == '(') { // Останавливаем, если встречаем открывающую скобку
break;
}
if (priority(lastOperator) >= priority(currElem)) { // Сравниваем приоритетность операторов
// Оператор из стека имеет высший или равный приоритет - вынимаем его
pop(&stack);
postfix[postfix_index++] = lastOperator;
postfix[postfix_index++] = ' ';
} else {
// Оператор из стека имеет низший - останаваливаем вынимание
break;
}
}
// Кладем текущий оператор в стек
push(&stack, currElem);
}
}

// Вынимаем все оставшиеся символы операций из стека
while (!StackEmptiness(&stack)) {
char lastOperator = pop(&stack);
postfix[postfix_index++] = lastOperator;
postfix[postfix_index++] = ' ';
}
}

int main() {
char infix[500];
char postfix[500];

printf("Введите выражение со скобками, цифрами и операторами ");
fgets(infix, sizeof(infix), stdin);


infix[strlen(infix) - 1] = '\0';

toPostfix(infix, postfix);

printf("Инфиксная форма: %s\n", infix);
printf("Постфиксная форма: %s\n", postfix);

return 0;
}
44 changes: 44 additions & 0 deletions src/hw5_Sort_And_Queue/sortingStation.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@

//
// File: sortingStation.h
// Author: Alexandra Dolzhenko
//
// Description: Этот модуль предоставляет функции для преобразования
// математических выражений из инфиксной формы в постфиксную (обратную польскую запись)
// с использованием алгоритма "сортировочной станции" Э. Дейкстры.
// Поддерживает операции: +, -, *, /, скобки () и цифры.
//

#ifndef TEST_SORTINGSTATION_H

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Стайлгайд запрещает использование include guards. Вместо них надо использовать pragma once.
Да и вообще, include guards сейчас используются только в древних проектах, типа стандартной библиотеки C или ядра Linux. Сейчас все стараются переходить на pragma once.

#define TEST_SORTINGSTATION_H

//
// Проверяет является ли символ оператором
// Параметр: currElem - символ для проверки
// Возвращает: 1 если оператор, 0 если нет
//
int isOperator(char currElem);

//
// Определяет приоритет оператора
// Параметр: currElem - оператор
// Возвращает: 2 для * /, 1 для + -, 0 для других символов
//
int priority(char currElem);

//
// Преобразует инфиксное выражение в постфиксное
// Параметры:
// infix - входное инфиксное выражение
// postfix - выходной буфер для постфиксного выражения
//
// Алгоритм:
// 1. Числа сразу добавляются в выходной массив
// 2. Открывающие скобки помещаются в стек
// 3. Закрывающие скобки выталкивают операторы из стека до открывающей скобки
// 4. Операторы выталкивают из стека операторы с высшим или равным приоритетом
// 5. В конце все оставшиеся операторы выталкиваются из стека
//
Comment on lines +35 to +41

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Описать используемый алгоритм -- очень хорошая идея, странно, что кроме Вас никто так не сделал. Ещё хорошо было бы здесь указать, что это алгоритм Сортировочной станции (или Дейкстры).

void toPostfix(char infix[], char postfix[]);

#endif //TEST_SORTINGSTATION_H
35 changes: 35 additions & 0 deletions src/hw5_Sort_And_Queue/stack.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
//
// Created by sasha on 23.10.2025.
//

#include "stack.h"

// Создаем стэк, делая значение top равным -1 ("нет элементов")
void init_stack(Stack *stack) {
stack->topIndex = -1;
}

// Добавляем элемент
void push(Stack *stack, char value) {
stack->topIndex++; // Увеличиваем индекс на 1
stack->elements[stack->topIndex] = value; // Добавляем сам элемент в массив
}

// Берем верхний элемент и удаляем его
char pop(Stack *stack) {
if (StackEmptiness(stack)) { // Проверяем не пуст ли стек
return '\0'; // Возвращаем '\0' если пуст (в таком виде, потому что нужно вернуть char)
}
char value = stack->elements[stack->topIndex]; // Сохраняем верхний элемент
stack->topIndex--; // Уменьшаем индекс
return value; // Возвращаем сохраненный элемент
}

// Проверяем пуст ли стек (Чтоб не убрать "пустоту")
int StackEmptiness(Stack *stack) {
if (stack->topIndex == -1) {
return 1; // 1 - стек пуст
} else {
return 0; // 0 - стек не пуст
}
}
51 changes: 51 additions & 0 deletions src/hw5_Sort_And_Queue/stack.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
//
// File: stack.h
// Author: Alexandra Dolzhenko
//
// Description: Этот модуль предоставляет функции для работы со стеком:
// создание стэка (init_stack), добавление (push), извлечение элементов (pop) и проверка на пустоту (is_empty).
// Нужен для двух задач: Продвинутый баланс скобок и Сортировочная станция
//

#ifndef TEST_STACK_H
#define TEST_STACK_H
#define STACK_SIZE 1000 // Ограничим максимальный размер стэка до 1000



//
// Структура для стека
// В ней создаем char массив для хранения элементов длины STACK_SIZE и переменную для хранения индекса верхнего элемента
//
typedef struct {
char elements[STACK_SIZE]; // массив для хранения
int topIndex; // индекс верхнего элемента
} Stack;

//
// Создание стека
// В качестве параметра берем указатель на стек (для изменения самого стека, а не только копии)
//
void init_stack(Stack *stack);

//
// Добавление элемента в стек
// Параметр - Указатель на стек и значение элемента для добавления
//
void push(Stack *stack, char value);

//
// Удаление элемента из стека с проверкой на пустоту
// Параметр - Указатель на стек
// Вернет значение элемента, если есть что удалять, и 0 если нет
//
char pop(Stack *stack);

//
// Проверка стэка на пустоту
// Параметр - Указатель на стек
// Вернет
//
int StackEmptiness(Stack *stack);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Функции, которые что-то проверяют обычно начинаются с Is или Does. Про это даже в стайлгайде сказано.


#endif //TEST_STACK_H
25 changes: 25 additions & 0 deletions src/hw_Optimal_Sort/main.c

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Надо удалить лишние файлы из PR.

Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#include <stdio.h>

// Объявление функции
extern int sort_array(int array[], int count);

// Основной код - объявление массива на 100 чисел, создание счетчика, чтобы знать со сколькими числами надо будет работать, чтение чисел через for с scanf и вывод
int main() {
int array[100];
int count = 0;

int i = 0;
while (i < 100 && scanf("%d", &array[i]) == 1) {
i++;
count++;
}

int moved = sort_array(array, count);

printf("Отсортированный массив:");
for (int i = 0; i < count; i++) {
printf("%d ", array[i]);
}
printf("\n");
return 0;
}
16 changes: 16 additions & 0 deletions src/hw_Optimal_Sort/sort.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
int sort_array(int* array, int count) {
int moved_count = 0;
// сортировка пузырьком
for (int i = 0; i < count - 1; i++) {
for (int j = 0; j < count - i - 1; j++) {
if (array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
moved_count++;
}
}
}

return moved_count;
}
67 changes: 67 additions & 0 deletions src/kr/diffPalindrome.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
//
// Created by sasha on 17.10.2025.
//

//Напечатать на экран все из диапазона [1;n],
//которые являются палиндромами в двоичной записи. Выводить в десятичной системе счисления.

#include <stdio.h>
#include <string.h>

int systemChangerTo2(int n) {
int binaryNum[1000]; //Массив для числа во вторичной
char charBinaryNum[1000]; // Массив для числа во вторичной, но в виде строки
int i = 0;
int len = 0;

while (n > 0) {
binaryNum[i] = n % 2;
n = n / 2;
i++;
len = i; // Длина массива
}

for (i = 0; i < len; i++) {
charBinaryNum[i] = binaryNum[i] + '0';
}

int left = 0;
int right = strlen(charBinaryNum) - 1;

while (left <= right) {
if (charBinaryNum[left] == charBinaryNum[right]) {
left++;
right--;
} else {
return 0;
}
if (left > right) {
return 1;
}
}
}




int main(void) {
int n = 0;

printf("Введите n \n");
scanf("%d",&n);

int arr[n];
int num = 0;

for (int i = 0; i < n; i++) {
arr[i] = num;
num++;

if (systemChangerTo2(num) == 1) {
printf("%d\n", num);
}
}


return 0;
}
Loading