LvPengwudi 2022-08-20 16:26 采纳率: 33.3%
浏览 20

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

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

img


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#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;
}
运行结果及报错内容
运行结果及报错内容
  • 写回答

1条回答 默认 最新

  • 雨下,听风 2022-08-20 16:49
    关注
    
    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);
        }
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 8月20日

悬赏问题

  • ¥15 需要数据库运行的图片
  • ¥15 如何获取vue-video-editor?
  • ¥100 vs2019 mfc程序如何实现64*64/48*48大小的真彩色工具栏
  • ¥15 全志v3s耳机音频输出口怎么外接功放
  • ¥15 华为ensp使用基本ACL限制公司网络访问
  • ¥15 帮我做下照片上的PLC题
  • ¥15 labview2022 使用modbus报缺少依赖?
  • ¥15 谷歌地图是不是不开通结算功能,api会使用不了哦
  • ¥15 unity腾讯云对象存储机型适配
  • ¥15 求全国交通咨询模拟代码,要求如下,可以完全在dev c++运行