Простейший пример с добавлением/удалением для стека на основе массива - 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, чтобы освободить память, выделенную под стек.