Простейший пример с добавлением/удалением для стека на основе массива - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Можно ли привести простейший пример с добавлением/удалением для стека на основе массива ?

Решение задачи: «Простейший пример с добавлением/удалением для стека на основе массива»

textual
Листинг программы
typedef struct {
  double *ptr;
  int head,
      size;
} STACK;
 
int Create(STACK *, int);
void Destroy(STACK *);
int Push(STACK *, double);
int Pop(STACK *, double *);
 
int main(int argc, char *argv[])
{
  setlocale(LC_ALL, "RU");
  STACK stack;
  int size;
  printf("Введите размер стека\n");
  scanf("%d", &size);
  if(Create(&stack, size)){
    printf("Не удалось выделить память под стек\n");
    return 0;}
  int n;
  printf("Сколько элементов вы хотите ввести?\n");
  scanf("%d", &n);
  printf("Вводите вещественные числа\n");
  for(int i=0; i<n; i++){
    double val;
    scanf("%lf", &val);
    if(Push(&stack, val)){
      printf("Переполнение стека\n");
      break;}
  }
  printf("Сколько элементов вы хотите извлечь?\n");
  scanf("%d", &n);
  while(n){
    double val;
    if(Pop(&stack, &val)){
      break;}
    printf("%lf ", val);
    n--;}
  printf("\n");
  Destroy(&stack);
 
  return 0;
}
 
int Create(STACK *stack, int size)
{
  stack->ptr = (double *)calloc(size, sizeof(double));
  if (!stack->ptr)
    return 1;
  stack->head = 0;
  stack->size = size;
  return 0;
}
 
void Destroy(STACK *stack)
{
  if (stack->ptr)
    free(stack->ptr);
  stack->size = stack->head = 0;
}
 
int Push(STACK *stack, double value)
{
  if (stack->head == stack->size)
    return 1;
  stack->ptr[stack->head++] = value;
  return 0;
}
 
int Pop(STACK *stack, double *value)
{
  if (!stack->head)
    return 1;
  *value = stack->ptr[--stack->head];
  return 0;
}

Объяснение кода листинга программы

  1. В этом коде определен тип структуры STACK, который содержит указатель на массив double и два целочисленных поля head и size.
  2. Определены функции Create, Destroy, Push и Pop, которые работают со стеком, основанным на массиве.
  3. В функции main пользователь вводит размер стека, количество элеменентов для ввода и извлечения, а затем вводит сами элементы.
  4. При создании стека выделяется память под массив double с помощью функции calloc. Если память не может быть выделена, функция Create возвращает 1, и программа выводит сообщение об ошибке.
  5. При вводе элементов в стек используется функция Push. Если head достигает size, то есть происходит переполнение стека, функция Push возвращает 1, и программа выводит сообщение об ошибке.
  6. При извлечении элементов из стека используется функция Pop. Если head равно 0, то есть стек пуст, функция Pop возвращает 1, и программа выводит сообщение об ошибке.
  7. Функция Destroy освобождает память, выделенную под массив double, с помощью функции free.
  8. В конце программы вызывается функция Destroy, чтобы освободить память, выделенную под стек.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.929 из 5
Похожие ответы