В вашем коде есть некоторые проблемы
ваш pop не симметричен вашему push , push post, увеличивающему индекс, поэтому pop должен предварительно уменьшать индекс, и из-за этого первый неверный индекс не -1, а 0:
char pop() // Pop char to top of stack
{
if (top == 0)
return -1;
else
return stack[--top];
}
приоритет не возвращает значение, если все тесты являются ложными, но, вероятно, последний тест бесполезен
В
while (priority(stack[top]) >= priority( * e))
вы пропустили, чтобы проверить, пуст ли стек, должно быть:
while ((top != 0) && (priority(stack[top]) >= priority( * e))) {
Поскольку первый недопустимый индекс для стека равен 0, а не -1
while (top! = -1) // печать оставшихся элементов в стеке
должно быть
while (top != 0) // printing remaining elements in the stack
Когда вы делаете постфиксное выражение, между числами нет разделения, например, «12 + 3» становится «123+», как «1 + 23», а в EvalPostfix вы считаете, что число имеет только одна цифра (eval_push(ch - '0');
), поэтому вы не можете управлять числами, имеющими более 1 цифры. Для управления несколькими цифрами добавьте разделитель после всех чисел, например, пробел, в котором должно быть "12 3+" или "1 23 +", и прочитайте число с помощью scanf и т. Д.
Вы не делаете правильное постфиксное выражение во всех случаях, например, для 1 + 2 * 3 вы делаете 12 + 3 *, но оно должно быть 123 * +
Вы не можете обнаружить недопустимые инфиксные выражения
в
while (priority(stack[top]) >= priority( * e))
Я пропустил, что верхний элемент не stack[top]
, а stack[top - 1]
, поэтому его нужно заменить на
while ((top != 0) && (priority(stack[top - 1]) >= priority( * e))) {
добавив, что исправление 1 + 2 * 3 приводит к правильному выражению постфикса 123 * +
Обратите внимание, что более понятно ввести функцию empty () и tops () , а в случае неправильного доступа в стек вывести сообщение и выйти, а не вернуть -1 как char
int empty()
{
return (top == 0);
}
char tops()
{
if (top == 0) {
fputs("top() on the empty stack, abort", stderr);
exit(-1);
}
return stack[top - 1];
}
char pop() // Pop char to top of stack
{
if (top == 0) {
fputs("pop() on the empty stack, abort", stderr);
exit(-1);
}
return stack[--top];
}
также обнаруживает возможное переполнение стека:
void push(char x) // Push char into stack
{
if (top == sizeof(stack)) {
fputs("stack overflow", stderr);
exit(-1);
}
stack[top++] = x;
}
так что теперь вы можете сделать
while (!empty() && (priority(tops()) >= priority( * e))) {
Конечно, то же самое для другого стека
Мне нужен код для учета пробелов и двузначных чисел
двойные цифры слишком ограничены, просто управляйте любым целым числом, для этого вы можете извлечь число, используя strtol . Вы также не можете прочитать полное выражение, используя scanf("%s", exp);
, потому что останавливается на первом пробеле, используйте fgets .