Простейший пример с добавлением/удалением для стека на основе массива - 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; }
Объяснение кода листинга программы
- В этом коде определен тип структуры
STACK
, который содержит указатель на массивdouble
и два целочисленных поляhead
иsize
. - Определены функции
Create
,Destroy
,Push
иPop
, которые работают со стеком, основанным на массиве. - В функции
main
пользователь вводит размер стека, количество элеменентов для ввода и извлечения, а затем вводит сами элементы. - При создании стека выделяется память под массив
double
с помощью функцииcalloc
. Если память не может быть выделена, функцияCreate
возвращает 1, и программа выводит сообщение об ошибке. - При вводе элементов в стек используется функция
Push
. Еслиhead
достигаетsize
, то есть происходит переполнение стека, функцияPush
возвращает 1, и программа выводит сообщение об ошибке. - При извлечении элементов из стека используется функция
Pop
. Еслиhead
равно 0, то есть стек пуст, функцияPop
возвращает 1, и программа выводит сообщение об ошибке. - Функция
Destroy
освобождает память, выделенную под массивdouble
, с помощью функцииfree
. - В конце программы вызывается функция
Destroy
, чтобы освободить память, выделенную под стек.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д