逆波兰表达式--出现的问题

输入一个值后报错显示位置冲突,我想了想可能是字符数组那里出现了问题,但不知道怎么解决。小伙伴们帮忙看看!!

img


#include
#include
#include
#define MAX_SIZE 1000
typedef struct my_stack {
    int* base; //指向栈底
    int* top;//指向栈顶
    int stacksize;
}Stack;

void init(Stack& st)  /// 初始化栈st
{
    st.base = (int*)malloc(sizeof(int) * MAX_SIZE);
    if (!st.base) {
        exit(0);
    }
    st.top = st.base;
    st.stacksize = MAX_SIZE;

}

bool full(Stack& st)  /// 判断是否栈满
{
    if (st.top-st.base>=st.stacksize) {
        return 1;
    }
    else {
        return 0;
    }
}

bool empty(Stack& st)  /// 判断是否栈空
{
    if (st.base == st.top) {
        return 1;
    }
    else {
        return 0;
    }
}

void push(Stack& st, int e)   /// e进栈
{
    *st.top = e;
    st.top++;

}
int pop(Stack& st, int& e)  /// 出栈,由参数e带回
{
    st.top--;
    return *st.top;

}
int main()
{
    Stack s;
    init(s);
    char str[MAX_SIZE];
    int d, e;
    scanf_s("%s", str);
    while (strcmp(str,"=")!=0)
    {
        if (strcmp(str, "/") == 0) {
            pop(s, e);
            pop(s, d);
            push(s, e / d);
        }
        else if (strcmp(str, "%") == 0) {
            pop(s, e);
            pop(s, d);
            push(s, e %d);
        }
        else if (strcmp(str, "+") == 0) {
            pop(s, e);
            printf("%d\n", e);
            pop(s, d);
            printf("%d\n", d);
            push(s, e + d);
        }
        else if (strcmp(str, "-") == 0)
        {
            pop(s, e);
            pop(s, d);
            push(s, e - d);
        }
        else if (strcmp(str, "*") == 0) {
            pop(s, e);
            pop(s, d);
            push(s, e * d);
        }
        else {
            int a = atoi(str);
            push(s, a);
            printf("%d\n", a);
        }
        scanf_s("%s", str);
    }
    pop(s, d);
    printf("%d", *s.top);
    return 0;
}
运行结果及报错内容
运行结果及报错内容

class Operator {
    Character sign;
    Integer level;
 
    Operator(Character sign, Integer level) {
        this.sign = sign;
        this.level = level;
    }
 
    public static boolean isOperator(String str) {
        if (str == null || str.length() == 0) {
            return false;
        }
        return "+".equals(str) || "-".equals(str) || "*".equals(str) || "/".equals(str);
    }
}
 
public class Test {
    public static void main(String[] args) {
        System.out.println(Arrays.toString(infixExprStrToPostfixExprList("1+(2+4)*5+8/2").toArray()));
        System.out.println(getPostfixExprVal(infixExprStrToPostfixExprList("1+(2+4)*5+8/2")));
    }
 
    /**
     * 中缀表达式串 -> 后缀表达式集合
     *
     * @param infixExprStr 中缀表达式串
     * @return 后缀表达式集合
     */
    private static List<String> infixExprStrToPostfixExprList(String infixExprStr) {
        char[] infixExprCharArr = infixExprStr.toCharArray();
        Stack<Operator> signStack = new Stack<>();
        StringBuffer numberBuffer = new StringBuffer();
        List<String> postfixExprList = new ArrayList<>(20);
        for (int index = 0; index < infixExprCharArr.length; index++) {
            char ch = infixExprCharArr[index];
            boolean isOperator = ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')';
            if (!isOperator) {
                numberBuffer.append(ch);
                continue;
            }
            if (numberBuffer.length() != 0) {
                postfixExprList.add(numberBuffer.toString());
                numberBuffer.setLength(0);
            }
            switch (ch) {
                case '+':
                    while (!signStack.isEmpty() && signStack.peek().level >= 1) {
                        postfixExprList.add(signStack.pop().sign.toString());
                    }
                    signStack.add(new Operator('+', 1));
                    break;
                case '-':
                    while (!signStack.isEmpty() && signStack.peek().level >= 1) {
                        postfixExprList.add(signStack.pop().sign.toString());
                    }
                    signStack.add(new Operator('-', 1));
                    break;
                case '*':
                    while (!signStack.isEmpty() && signStack.peek().level >= 2) {
                        postfixExprList.add(signStack.pop().sign.toString());
                    }
                    signStack.add(new Operator('*', 2));
                    break;
                case '/':
                    while (!signStack.isEmpty() && signStack.peek().level >= 2) {
                        postfixExprList.add(signStack.pop().sign.toString());
                    }
                    signStack.add(new Operator('/', 2));
                    break;
                case '(':
                    signStack.add(new Operator('(', 0));
                    break;
                case ')':
                    while (!signStack.isEmpty() && signStack.peek().level != 0) {
                        postfixExprList.add(signStack.pop().sign.toString());
                    }
                    if (!signStack.isEmpty() && signStack.peek().level == 0) {
                        signStack.pop();
                    }
                    break;
                default:
            }
        }
        if (numberBuffer.length() != 0) {
            postfixExprList.add(numberBuffer.toString());
        }
        while (!signStack.isEmpty()) {
            postfixExprList.add(signStack.pop().sign.toString());
        }
        return postfixExprList;
    }
 
    /**
     * 获取后缀表达式的值
     * @param postfixExprList 后缀表达式集合
     * @return 最终的计算值
     */
    private static BigDecimal getPostfixExprVal(List<String> postfixExprList) {
        Stack<String> calculateStack = new Stack<>();
        for (String content : postfixExprList) {
            if (Operator.isOperator(content)) {
                String number2 = calculateStack.pop();
                String number1 = calculateStack.pop();
                String result = "";
                switch (content) {
                    case "+":
                        result = strToNumber(number1).add(strToNumber(number2)).toString();
                        break;
                    case "-":
                        result = strToNumber(number1).subtract(strToNumber(number2)).toString();
                        break;
                    case "*":
                        result = strToNumber(number1).multiply(strToNumber(number2)).toString();
                        break;
                    case "/":
                        result = strToNumber(number1).divide(strToNumber(number2), 10, BigDecimal.ROUND_HALF_UP).toString();
                        break;
                    default:
                }
                calculateStack.push(result);
            } else {
                calculateStack.push(content);
            }
        }
        return strToNumber(calculateStack.pop());
    }
 
    /**
     * 数字串转数字
     *
     * @param numberStr 数字串
     * @return BigDecimal 类型数字
     */
    private static BigDecimal strToNumber(String numberStr) {
           return new BigDecimal(numberStr);
    }
}