Реализация стека - C (СИ)

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

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

Не получается исправить ошибки
#include <stdio.h>
#include <locale.h>
#include <conio.h>
#include "stdafx.h"
#include <Windows.h>
 
#define STACK_OVERFLOW  -100
#define STACK_UNDERFLOW -101
 
#define INIT_SIZE 2
#define STACK_OVERFLOW  -100
#define STACK_UNDERFLOW -101
#define OUT_OF_MEMORY   -102
#define MULTIPLIER 2
 
#define STACK_MAX_SIZE 20
typedef int T;
typedef struct Stack_tag {
    T *data;
    size_t size;
    size_t top;
} Stack_t;
 
Stack_t* createStack(int size) {    //Создание стака
    Stack_t *out = NULL;
    out = malloc(sizeof(Stack_t));
    if (out == NULL) {
        exit(OUT_OF_MEMORY);
    }
    out->size = size;
    out->data = malloc(out->size * sizeof(T));
    if (out->data == NULL) {
        free(out);
        exit(OUT_OF_MEMORY);
    }
    out->top = 0;
    return out;
}
 
void deleteStack(Stack_t **stack) {
    free((*stack)->data);
    free(*stack);
    *stack = NULL;
}
 
void resize(Stack_t *stack) {
    stack->size *= MULTIPLIER;
    stack->data = realloc(stack->data, stack->size * sizeof(T));
    if (stack->data == NULL) {
        exit(STACK_OVERFLOW);
    }
}
 
void push(Stack_t *stack, T value) {        //Вставка елемента в стак
    if (stack->top >= stack->size) {
        resize(stack);
    }
    stack->data[stack->top] = value;
    stack->top++;
    stack->size++;
}
 
T pop(Stack_t *stack) {             //Удаление последнего елемента из стака
    if (stack->top == 0) {
        exit(STACK_UNDERFLOW);
    }
    stack->top--;
    stack->size--;
    return stack->data[stack->top];
}
 
T peek(const Stack_t *stack) {
    if (stack->top <= 0) {
        exit(STACK_UNDERFLOW);
    }
    return stack->data[stack->top - 1];
}
 
void printStackValue(const T value) {   //Печать значение стака
    printf("%d", value);
}
 
void printStack(const Stack_t *stack, void(*printStackValue)(const T)) {    //Печать стака
    int i;
    int len = stack->size -1;
    printf("стек %d > ", stack->size-1);
    for (i = 0; i < len; i++) {
        printStackValue(stack->data[i]);
        printf("  ");
    }
    /*if (stack->size != 0) {
        printStackValue(stack->data[i]);
    }*/
    printf("\n");
}
 
void printStack1(const Stack_t *stack, void(*printStackValue)(const T)) {   //Печать стака
    int i;
    int len = stack->size - 1;
    printf("stack %d > ", stack->size-1);
    for (i = 0; i < len; i++) {
        if (i == 0) {
            printStackValue(stack->data[i]);
        }
    }
    /*if (stack->size != 0) {
    printStackValue(stack->data[i]);
    }*/
    printf("\n");
}
 
void clean_stdin() // Функция очистки буфера ввода с клавиатуры
{
    fflush(stdin);
    fseek(stdin, 0, SEEK_END);
}
 
int getInt() {
    int err, a;
    do
    {
        err = 0; // Очистка переменной отвечающей за наличие ошибок (если ошибки будут, программа задаст значание позже)
        printf("\nВведите  єлемент ");
        clean_stdin(); // Очистить буфер ввода 
        if (scanf("%i[0-9]", &a) == 1) {} // Проверка ввел ли пользователь буквы или цифры
        else
        {
            printf("Вы ввели буквы, повторите ввод");
            err = 1; // Произошла ошибка.
        }
        if (a > 10000 || a < -10000) // Проверка введенного числа на вхождение в допустимый диапазон вводимых чисел
        {
            printf("Введенное число не входит в допустимый диапазон\nДопустимый диапазон: -10000 - 10000");
            err = 1; // Произошла ошибка.
        }
    } while (err == 1); // Повторять пока есть ошибка
 
return a;
}
 
int main() {
    int a,b,i,size=1,error;
 
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    /*printf("Введите размер стека");
    scanf("%i",&size);*/
    Stack_t *s = createStack(size);
    int f = s->size ;
    
    do {
        printf("\nЄлементом сруктуры является точка в пространстве");
    printf("\n\n1) Добавление елемента в стек");
    printf("\n2) Удаление елемента из стека");
    printf("\n3) Чтение первого элемента стека");
    printf("\n4) Проверить на пустоту стек");
    printf("\n5) Получить размер стека");
    printf("\n0) Выйти");
 
        //printf("\nВведите число : ");
        //scanf("%i[0-9]", &b);
        b = getInt();
 
    switch (b)
        {
        case 1:
            if (s->size < 4) {
                printf("\nВведите новый єлемент:");
                a = getInt();
                push(s, a);
                printStack(s, printStackValue, f);
                //f--;
                getchar();
            }
            else printf("Стек полн");
            break;
        case 2:
            if (s->size-1) {
                pop(s);
                f++;
                printStack(s, printStackValue);
            }
            printf("\nСтек пуст");
            break;
        case 3:
            printStack1(s, printStackValue);
            break;
        case 4:
            if (s->size == 1) {
                printf("\nСтек пуст");
            }
            else
                printf("\nСтек не пуст уго размер =%i", s->size-1);
            break;
        case 5:
            printf("\nРазмер стека=%i", s->size-1);
            break;
        case 0:
            return 0;
        default:
            break;
        }
    } while (b);
 
    system("pause");
 
    return 0;
}

Решение задачи: «Реализация стека»

textual
Листинг программы
[CLANG][/CLANG]

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


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

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

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