From 07b99eebf8ffb3907a6e7dbf7be4d1bbe475097e Mon Sep 17 00:00:00 2001 From: Vsevolod Kharinov Date: Sun, 22 Dec 2024 23:23:02 +0300 Subject: [PATCH 1/5] =?UTF-8?q?=D0=9F=D0=BE=D0=BA=D1=80=D1=8B=D1=82=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BA=D0=BE=D0=B4=D0=B0=20=D1=82=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 05_hw/CMakeLists.txt | 3 + 05_hw/test_stack.c | 183 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 186 insertions(+) create mode 100644 05_hw/test_stack.c diff --git a/05_hw/CMakeLists.txt b/05_hw/CMakeLists.txt index 6f5e398..94f4972 100644 --- a/05_hw/CMakeLists.txt +++ b/05_hw/CMakeLists.txt @@ -5,3 +5,6 @@ add_library(stack stack.c) add_executable(main main.c) target_link_libraries(main stack) + +add_executable(test_stack test_stack.c) +target_link_libraries(test_stack stack) \ No newline at end of file diff --git a/05_hw/test_stack.c b/05_hw/test_stack.c new file mode 100644 index 0000000..75e46a3 --- /dev/null +++ b/05_hw/test_stack.c @@ -0,0 +1,183 @@ +#include "stack.h" +#include +#include +#include + +void test_push() { + Stack stack; + initStack(&stack); + + push(&stack, 10); + push(&stack, 20); + push(&stack, 30); + + // Проверяем, что верхний элемент стека - это 30 + Node* top = getTop(&stack); + assert(top != NULL && top->data == 30); + + destroyStack(&stack); + printf("test_push: SUCCESS\n"); +} + +void test_pop() { + Stack stack; + initStack(&stack); + + push(&stack, 10); + push(&stack, 20); + push(&stack, 30); + + pop(&stack); + Node* top = getTop(&stack); + assert(top != NULL && top->data == 20); + + pop(&stack); + top = getTop(&stack); + assert(top != NULL && top->data == 10); + + pop(&stack); + assert(isEmpty(&stack)); + + destroyStack(&stack); + printf("test_pop: SUCCESS\n"); +} + +void test_isEmpty() { + Stack stack; + initStack(&stack); + + assert(isEmpty(&stack)); + + push(&stack, 10); + assert(!isEmpty(&stack)); + + pop(&stack); + assert(isEmpty(&stack)); + + destroyStack(&stack); + printf("test_isEmpty: SUCCESS\n"); +} + +void test_searchByValue() { + Stack stack; + initStack(&stack); + + push(&stack, 10); + push(&stack, 20); + push(&stack, 30); + + Node* result = searchByValue(&stack, 20); + assert(result != NULL && result->data == 20); + + result = searchByValue(&stack, 40); + assert(result == NULL); + + destroyStack(&stack); + printf("test_searchByValue: SUCCESS\n"); +} + +void test_searchByIndex() { + Stack stack; + initStack(&stack); + + push(&stack, 10); + push(&stack, 20); + push(&stack, 30); + + Node* result = searchByIndex(&stack, 0); + assert(result != NULL && result->data == 30); + + result = searchByIndex(&stack, 2); + assert(result != NULL && result->data == 10); + + result = searchByIndex(&stack, 3); + assert(result == NULL); + + destroyStack(&stack); + printf("test_searchByIndex: SUCCESS\n"); +} + +void test_getTop() { + Stack stack; + initStack(&stack); + + push(&stack, 10); + push(&stack, 20); + + Node* top = getTop(&stack); + assert(top != NULL && top->data == 20); + + pop(&stack); + top = getTop(&stack); + assert(top != NULL && top->data == 10); + + pop(&stack); + top = getTop(&stack); + assert(top == NULL); + + destroyStack(&stack); + printf("test_getTop: SUCCESS\n"); +} + +void test_destroyStack() { + Stack stack; + initStack(&stack); + + push(&stack, 10); + push(&stack, 20); + push(&stack, 30); + + destroyStack(&stack); + assert(getTop(&stack) == NULL); + + printf("test_destroyStack: SUCCESS\n"); +} + +void test_createNode() { + Node* node = createNode(42); + assert(node != NULL && node->data == 42 && node->next == NULL); + free(node); + printf("test_createNode: SUCCESS\n"); +} + +void test_initStack() { + Stack stack; + initStack(&stack); + assert(stack.top == NULL); + printf("test_initStack: SUCCESS\n"); +} + +void test_traverseStack() { + Stack stack; + initStack(&stack); + + push(&stack, 10); + push(&stack, 20); + push(&stack, 30); + + printf("Expected output: Stack elements: 30 20 10\n"); + printf("Actual output: "); + traverseStack(&stack); + + destroyStack(&stack); + printf("test_traverseStack: SUCCESS\n"); +} + +int main() { + printf("Running tests...\n"); + + test_createNode(); + test_initStack(); + test_destroyStack(); + test_push(); + test_pop(); + test_searchByValue(); + test_searchByIndex(); + test_getTop(); + test_traverseStack(); + test_isEmpty(); + + printf("All tests completed.\n"); + + return 0; +} \ No newline at end of file From 15b165a2bf02709f17ed19e443487cdd4f151dba Mon Sep 17 00:00:00 2001 From: Vsevolod Kharinov Date: Sun, 22 Dec 2024 23:27:14 +0300 Subject: [PATCH 2/5] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 05_hw/stack.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/05_hw/stack.c b/05_hw/stack.c index 0964440..c9fe6b1 100644 --- a/05_hw/stack.c +++ b/05_hw/stack.c @@ -17,10 +17,11 @@ void initStack(Stack* stack) { void destroyStack(Stack* stack) { Node* current = stack->top; while (current != NULL) { - Node *tmp = current; + Node* tmp = current; current = current->next; - free(tmp); + free(tmp); } + stack->top = NULL; // Обнуляем указатель на вершину } void push(Stack* stack, int data) { @@ -30,8 +31,12 @@ void push(Stack* stack, int data) { } void pop(Stack* stack) { + if (stack->top == NULL) { + return; // Безопасно выходим, если стек пуст + } Node* temp = stack->top; stack->top = stack->top->next; + free(temp); } Node* searchByValue(Stack* stack, int value) { @@ -40,6 +45,7 @@ Node* searchByValue(Stack* stack, int value) { if (current->data == value) { return current; } + current = current->next; // Обновляем указатель } return NULL; } @@ -72,7 +78,5 @@ void traverseStack(Stack* stack) { } bool isEmpty(Stack* stack) { - free(stack->top); return stack->top == NULL; -} - +} \ No newline at end of file From 91a654c087c634ced5d126ef18dd47010f4c0a9c Mon Sep 17 00:00:00 2001 From: Vsevolod Kharinov Date: Sun, 22 Dec 2024 23:35:23 +0300 Subject: [PATCH 3/5] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=BE=D0=BA=D1=80=D1=8B=D1=82=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=B4=D0=B0=20=D1=82=D0=B5=D1=81=D1=82=D0=B0=D0=BC?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 05_hw/CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/05_hw/CMakeLists.txt b/05_hw/CMakeLists.txt index 94f4972..e2304bb 100644 --- a/05_hw/CMakeLists.txt +++ b/05_hw/CMakeLists.txt @@ -7,4 +7,7 @@ add_executable(main main.c) target_link_libraries(main stack) add_executable(test_stack test_stack.c) -target_link_libraries(test_stack stack) \ No newline at end of file +target_link_libraries(test_stack stack) + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage -g") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage") \ No newline at end of file From f347bf3d176e2a830621e15454dc6ae96fcd1bd9 Mon Sep 17 00:00:00 2001 From: Vsevolod Kharinov Date: Mon, 23 Dec 2024 01:33:24 +0300 Subject: [PATCH 4/5] =?UTF-8?q?=D0=A1=D1=82=D0=B0=D1=82=D0=B8=D1=87=D0=B5?= =?UTF-8?q?=D1=81=D0=BA=D0=B8=D0=B9=20=D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=82=D0=BE=D1=80=20=D0=B8=20=D0=B8=D1=81=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80=D0=B5?= =?UTF-8?q?=D0=B4=D1=83=D0=BF=D1=80=D0=B5=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B9=20=D0=BD=D0=B0=20=D0=BA=D0=BE=D0=BD=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D0=BD=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 05_hw/main.c | 4 ++-- 05_hw/stack.c | 4 ++-- 05_hw/stack.h | 4 ++-- 05_hw/test_stack.c | 10 +++++----- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/05_hw/main.c b/05_hw/main.c index fded814..917a284 100644 --- a/05_hw/main.c +++ b/05_hw/main.c @@ -18,14 +18,14 @@ int main() { printf("After popping an element:\n"); traverseStack(&stack); - Node* searchResult = searchByValue(&stack, 20); + const Node* searchResult = searchByValue(&stack, 20); if (searchResult != NULL) { printf("Element with value 20 found.\n"); } else { printf("Element with value 20 not found.\n"); } - Node* topElement = getTop(&stack); + const Node* topElement = getTop(&stack); if (topElement != NULL) { printf("Top element: %d\n", topElement->data); } diff --git a/05_hw/stack.c b/05_hw/stack.c index c9fe6b1..c1d2696 100644 --- a/05_hw/stack.c +++ b/05_hw/stack.c @@ -63,7 +63,7 @@ Node* searchByIndex(Stack* stack, int index) { return NULL; } -Node* getTop(Stack* stack) { +Node* getTop(const Stack* stack) { return stack->top; } @@ -77,6 +77,6 @@ void traverseStack(Stack* stack) { printf("\n"); } -bool isEmpty(Stack* stack) { +bool isEmpty(const Stack* stack) { return stack->top == NULL; } \ No newline at end of file diff --git a/05_hw/stack.h b/05_hw/stack.h index ef0734e..bc879fa 100644 --- a/05_hw/stack.h +++ b/05_hw/stack.h @@ -29,11 +29,11 @@ Node* searchByValue(Stack* stack, int value); Node* searchByIndex(Stack* stack, int index); -Node* getTop(Stack* stack); +Node* getTop(const Stack* stack); void traverseStack(Stack* stack); -bool isEmpty(Stack* stack); +bool isEmpty(const Stack* stack); #ifdef __cplusplus } diff --git a/05_hw/test_stack.c b/05_hw/test_stack.c index 75e46a3..98b9eaf 100644 --- a/05_hw/test_stack.c +++ b/05_hw/test_stack.c @@ -12,7 +12,7 @@ void test_push() { push(&stack, 30); // Проверяем, что верхний элемент стека - это 30 - Node* top = getTop(&stack); + const Node* top = getTop(&stack); assert(top != NULL && top->data == 30); destroyStack(&stack); @@ -28,7 +28,7 @@ void test_pop() { push(&stack, 30); pop(&stack); - Node* top = getTop(&stack); + const Node* top = getTop(&stack); assert(top != NULL && top->data == 20); pop(&stack); @@ -66,7 +66,7 @@ void test_searchByValue() { push(&stack, 20); push(&stack, 30); - Node* result = searchByValue(&stack, 20); + const Node* result = searchByValue(&stack, 20); assert(result != NULL && result->data == 20); result = searchByValue(&stack, 40); @@ -84,7 +84,7 @@ void test_searchByIndex() { push(&stack, 20); push(&stack, 30); - Node* result = searchByIndex(&stack, 0); + const Node* result = searchByIndex(&stack, 0); assert(result != NULL && result->data == 30); result = searchByIndex(&stack, 2); @@ -104,7 +104,7 @@ void test_getTop() { push(&stack, 10); push(&stack, 20); - Node* top = getTop(&stack); + const Node* top = getTop(&stack); assert(top != NULL && top->data == 20); pop(&stack); From 86b7bdfc3fcb00220237bbdb44f0e882d5ee279a Mon Sep 17 00:00:00 2001 From: Vsevolod Kharinov Date: Tue, 24 Dec 2024 01:45:32 +0300 Subject: [PATCH 5/5] =?UTF-8?q?=D0=91=D0=B5=D0=BD=D1=87=D0=BC=D0=B0=D1=80?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D0=B1=D0=B0=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D1=8B=D1=85=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B9?= =?UTF-8?q?=20(push=20/=20pop)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 05_hw/CMakeLists.txt | 5 +++- 05_hw/benchmark_push_pop.c | 50 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 05_hw/benchmark_push_pop.c diff --git a/05_hw/CMakeLists.txt b/05_hw/CMakeLists.txt index e2304bb..9f7516f 100644 --- a/05_hw/CMakeLists.txt +++ b/05_hw/CMakeLists.txt @@ -10,4 +10,7 @@ add_executable(test_stack test_stack.c) target_link_libraries(test_stack stack) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage -g") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage") \ No newline at end of file +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage") + +add_executable(benchmark_push_pop benchmark_push_pop.c) +target_link_libraries(benchmark_push_pop stack) \ No newline at end of file diff --git a/05_hw/benchmark_push_pop.c b/05_hw/benchmark_push_pop.c new file mode 100644 index 0000000..367558d --- /dev/null +++ b/05_hw/benchmark_push_pop.c @@ -0,0 +1,50 @@ +#include +#include +#include +#include "stack.h" + +// Функция для проведения бенчмарков push +void benchmark_push(Stack* stack, size_t test_size) { + clock_t start = clock(); + for (size_t i = 0; i < test_size; i++) { + push(stack, (int)i); + } + clock_t end = clock(); + printf("Push %zu: %.6f seconds\n", test_size, (double)(end - start) / CLOCKS_PER_SEC); +} + +// Функция для проведения бенчмарков pop +void benchmark_pop(Stack* stack, size_t test_size) { + clock_t start = clock(); + for (size_t i = 0; i < test_size; i++) { + pop(stack); + } + clock_t end = clock(); + printf("Pop %zu: %.6f seconds\n", test_size, (double)(end - start) / CLOCKS_PER_SEC); +} + +int main() { + Stack stack; + initStack(&stack); + + // Массив с разными объемами данных + size_t test_sizes[] = { 1000000, 10000000 }; + + for (int i = 0; i < 3; i++) { + size_t test_size = test_sizes[i]; + + // Benchmark push + benchmark_push(&stack, test_size); + + // Refill stack for pop benchmark + for (size_t j = 0; j < test_size; j++) { + push(&stack, (int)j); + } + + // Benchmark pop + benchmark_pop(&stack, test_size); + } + + destroyStack(&stack); + return 0; +}