Advertisement
dllbridge

Stack

Jun 11th, 2024 (edited)
408
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.09 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "stack.h"
  4.  
  5. int main() {
  6.   // Создать стек
  7.   Stack* stack = create_stack();
  8.  
  9.   // Добавить элементы в стек
  10.   push(stack, 10);
  11.   push(stack, 20);
  12.   push(stack, 30);
  13.  
  14.   // Проверить, пуст ли стек
  15.   if (is_empty(stack)) {
  16.     printf("Стек пуст.\n");
  17.   } else {
  18.     printf("Стек не пуст.\n");
  19.   }
  20.  
  21.   // Удалить элементы из стека
  22.   int popped_value = pop(stack);
  23.   printf("Удаленное значение: %d\n", popped_value);
  24.  
  25.   popped_value = pop(stack);
  26.   printf("Удаленное значение: %d\n", popped_value);
  27.  
  28.   // Проверить, пуст ли стек
  29.   if (is_empty(stack)) {
  30.     printf("Стек пуст.\n");
  31.   } else {
  32.     printf("Стек не пуст.\n");
  33.   }
  34.  
  35.   // Уничтожить стек
  36.   destroy_stack(stack);
  37.  
  38.   return 0;
  39. }
  40.  
  41. // file   stack.h
  42.  
  43.  
  44. #ifndef STACK_H
  45. #define STACK_H
  46.  
  47. #include <stdlib.h>
  48.  
  49. typedef struct node {
  50.   int data;
  51.   struct node* next;
  52. } Node;
  53.  
  54. typedef struct stack {
  55.   Node* head;
  56.   Node* tail;
  57.   int size;
  58. } Stack;
  59.  
  60. // Функция создания стека
  61. Stack* create_stack();
  62.  
  63. // Функция добавления элемента в стек
  64. void push(Stack* stack, int value);
  65.  
  66. // Функция удаления элемента из стека
  67. int pop(Stack* stack);
  68.  
  69. // Функция проверки, пуст ли стек
  70. int is_empty(Stack* stack);
  71.  
  72. // Функция уничтожения стека
  73. void destroy_stack(Stack* stack);
  74.  
  75. #endif
  76.  
  77.  
  78. // file stack.c
  79.  
  80.  
  81. #include <stdlib.h>
  82. #include "stack.h"
  83.  
  84. // Функция создания стека
  85. Stack* create_stack() {
  86.   Stack* stack = (Stack*)malloc(sizeof(Stack));
  87.  
  88.   stack->head = NULL;
  89.   stack->tail = NULL;
  90.   stack->size = 0;
  91.  
  92.   return stack;
  93. }
  94.  
  95. // Функция добавления элемента в стек
  96. void push(Stack* stack, int value) {
  97.   Node* new_node = (Node*)malloc(sizeof(Node));
  98.  
  99.   new_node->data = value;
  100.   new_node->next = NULL;
  101.  
  102.   if (stack->head == NULL) {
  103.     stack->head = new_node;
  104.     stack->tail = new_node;
  105.   } else {
  106.     stack->tail->next = new_node;
  107.     stack->tail = new_node;
  108.   }
  109.  
  110.   stack->size++;
  111. }
  112.  
  113. // Функция удаления элемента из стека
  114. int pop(Stack* stack) {
  115.   if (stack->head == NULL) {
  116.     return -1;  // Стек пуст
  117.   }
  118.  
  119.   Node* popped_node = stack->head;
  120.   int popped_value = popped_node->data;
  121.  
  122.   stack->head = stack->head->next;
  123.   if (stack->head == NULL) {
  124.     stack->tail = NULL;
  125.   }
  126.  
  127.   free(popped_node);
  128.   stack->size--;
  129.  
  130.   return popped_value;
  131. }
  132.  
  133. // Функция проверки, пуст ли стек
  134. int is_empty(Stack* stack) {
  135.   return stack->size == 0;
  136. }
  137.  
  138. // Функция уничтожения стека
  139. void destroy_stack(Stack* stack) {
  140.   while (stack->head != NULL) {
  141.     Node* current_node = stack->head;
  142.     stack->head = stack->head->next;
  143.  
  144.     free(current_node);
  145.   }
  146.  
  147.   stack->tail = NULL;
  148.   stack->size = 0;
  149.  
  150.   free(stack);
  151. }
Tags: Stack
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement