对于后缀表达式的输出错误问题

在做中缀表达式转换到后缀表达式的实验的时候,输入的是31*5(三十一乘以五),预期输出是31 5 *(三十一 五 乘号),但是输出成了3 1 5 *,,我想问问,上面的函数在哪里设计出错了呢?如果要修改应该怎么修改,main函数里的内容不允许修改。感谢回答

#include <stdio.h>
#include <stdlib.h>

#define STACK_SIZE 100


using namespace std;
// 定义栈结构
typedef struct stack {
    int top;
    char data[STACK_SIZE];
} Stack;

// 初始化栈
void initStack(Stack* s) {
    s->top = -1;
}

// 判断栈是否为空
int isEmpty(Stack* s) {
    return s->top == -1;
}

// 判断栈是否已满
int isFull(Stack* s) {
    return s->top == STACK_SIZE - 1;
}

// 获取栈顶元素
char getTop(Stack* s) {
    return s->data[s->top];
}

// 压栈
void push(Stack* s, char x) {
    if (isFull(s)) {
        printf("Error: Stack is full\n");
        exit(-1);
    }
    s->top++;
    s->data[s->top] = x;
}

// 出栈
char pop(Stack* s) {
    if (isEmpty(s)) {
        printf("Error: Stack is empty\n");
        exit(-1);
    }
    char x = s->data[s->top];
    s->top--;
    return x;
}

// 判断字符是否是数字
int isDigit(char c) {
    return c >= '0' && c <= '9';
}

// 判断字符是否是运算符
int isOperator(char c) {
    return c == '+' || c == '-' || c == '*' || c == '/';
}

// 获取运算符优先级
int getPriority(char op) {
    switch (op) {
    case '+':
    case '-':
        return 1;
    case '*':
    case '/':
        return 2;
    default:
        return 0;
    }
}

// 将中缀表达式转换为后缀表达式
Stack inToPost(char* expression) {
    Stack s;
    Stack post;
    initStack(&s);
    initStack(&post);

    for (int i = 0; expression[i] != '\0'; i++) {
        char c = expression[i];
        if (isDigit(c)) { // 如果是数字直接压入后缀栈
            push(&post, c);
        }
        else if (isOperator(c)) { // 如果是运算符
            while (!isEmpty(&s) && getPriority(getTop(&s)) >= getPriority(c)) { // 取出优先级更高或相等的运算符
                push(&post, pop(&s)); // 将取出的运算符压入后缀栈
            }
            push(&s, c); // 压入当前运算符
        }
        else if (c == '(') { // 如果是左括号,直接压入中缀栈
            push(&s, c);
        }
        else if (c == ')') { // 如果是右括号
            while (getTop(&s) != '(') { // 取出括号内的所有运算符
                push(&post, pop(&s)); // 将取出的运算符压入后缀栈
            }
            pop(&s); // 弹出左括号
        }
    }

    while (!isEmpty(&s)) { // 将中缀栈剩余的运算符都取出来压入后缀栈
        push(&post, pop(&s));
    }

    return post;
}

// 输出后缀表达式
void print1(Stack s)
{
    Stack s1;
    initStack(&s1);
    while (!isEmpty(&s)) {
        push(&s1, pop(&s));
    }
    while (!isEmpty(&s1)) {
        printf("%c ", pop(&s1));
    }
}

int main(void) {
    char express[80];
    gets_s(express);
    Stack s = inToPost(express);
    print1(s);
    return 0;
}

inToPost()一次只处理了一个字符,31被当成两个数分别处理了。你可看看我的这篇文章,链式栈四则运算这个案例有多位数的处理:栈和队列:理解与使用_创意程序员的博客-CSDN博客