Здравствуйте! Возникла необходимость реализации стека в учебной программе. Нужен совет, как
правильнее реализовывать функцию pop(1). А именно, интересует проблема обработки исключения "когда стек пустой".
Язык pure C.
Написал несколько вариантов, все работают, но ни один мне не нравится окончательно.
1)
typedef enum {EMPTY, POPPED} pop_t;
pop_t pop(stack **x);
Самый первый вариант. Функция не возвращает сам элемент стека, а только выкидывает его. Т.е. для чтения элемента стека нужно напрямую обращаться к структуре => снова возникает проблема пустого стека => бредовый вариант. Ну или делать отдельную функцию для чтения.
2)
double pop(stack **x)
{
stack *temp=*x;
if(!*x) fprintf(stderr, "Trying to pop from an empty stack!\n"), exit(EXIT_FAILURE); (или другие варианты, например abort())
...
return var;
В принципе неплохой вариант, но мне не нравится, что он подразумевает только один вариант решения проблемы пустого стека на все случаи жизни - тупо закрывать программу. Между тем, такая ошибка может возникнуть как в результате программной ошибки, так и в результате неправильных входных данных - это нужно отдельно обрабатывать. В общем, если по-русски, не хочу, чтобы исключения обрабатывала функция, а хочу делать это отдельно каждый раз сам. А она пусть только статус возвращает.
3)
typedef struct
{
double var;
enum {EMPTY, POPPED} status;
} pop_t;
pop_t pop(stack **x);
Т.е. функция как бы "кортежем" возвращает сразу и само значения из стека и статус (нормально ли досталось, или стек был пустой). На мой взгляд самый хороший вариант, т.к. даёт нам сразу и само значение, и позволяет обработать вариант EMPTY каждый раз по-своему.
Но такой подход требует больше памяти на возвращаемое значение и, самое главное, что мне очень не нравится - требует каждый раз при работе со стеком заводить специальную переменную типа pop_t, что очень некрасиво на мой взгляд.
4) Внешние переменные. Не нравится, т.к. функция становится завязанной на какие-то внешние переменные, перестаёт быть "чёрным ящиком". Наверняка в теории ООП для этого есть специальное слово даже, но лень гуглить.