Я пытаюсь рекурсивно реализовать стек LIFO без использования массивов.Программа принимает в качестве входных данных строки и целые числа и имеет несколько команд, а именно: push <int>
pop
empty
top
и quit
.
Все, кроме pop
у меня работает нормально, а pop
работает только частично.Это нормально, если вы получаете только один int, но кроме этого он возвращает мне stack is empty
, хотя это не так.Я понимаю, почему это происходит, но я не уверен, как это исправить.
int stack(int top, int last) {
int m = read_symbol();
if (m != READ_FAIL) {
if (m == PUSH_SYMBOL) {
int n = read_int();
top = stack(n, top);
} else if (m == POP_SYMBOL) {
if (top == INT_MIN) {
printf("pop error - stack is empty\n");
top = stack(INT_MIN, INT_MIN);
} else {
top = stack(last, INT_MIN);
}
} else if (m == TOP_SYMBOL) {
if (top == INT_MIN) {
printf("top error - stack is empty\n");
} else {
printf("top - %d\n", top);
}
top = stack(top, last);
} else if (m == EMPTY_SYMBOL) {
if (top == INT_MIN) {
printf("stack is empty\n");
} else {
printf("stack is not empty\n");
}
top = stack(top, last);
} else if (m == QUIT_SYMBOL) {
if (top != INT_MIN) {
printf("quit error - stack is not empty\n");
top = stack(top, last);
} else {
printf("goodbye\n");
}
}
}
return top;
}
Переменная top
возвращается рекурсивно, поэтому все работает нормально.Но когда я делаю что-то вроде
push 1
push 2
push 3
top
pop
top
pop
top
, возвращается результат
top - 3
top - 2
top error - stack is empty (SHOULD BE 1)
, я пробовал разные подходы, но я не смог решить его.Фактически я ввел параметр last
просто для того, чтобы попытаться решить эту проблему, остальная часть реализации работает нормально даже без last
, но пока этот параметр работает, но только для одной команды pop
, потому что устанавливается следующий уровень рекурсииlast
до INT_MIN
, который затем устанавливается на top
, если вы снова pop
, следовательно, ложное stack is empty
сообщение
любые указатели или помощь будут оценены.
РЕДАКТИРОВАТЬ: INT_MIN
относится к C99 limits.h
INT_MIN
, что составляет - (2 ^ 32 - 1)