1 条题解

  • 0
    @ 2023-2-7 13:40:15
    #include <cstdio>
    #include <iostream>
    using namespace std;
    const int maxSize = 20;
    int getPriority(char i) { // 得到符号的优先级
        switch (i) {
        case '+':
        case '-':
            return 1;
        case '*':
        case '/':
            return 2;
        }
    }
    int infixToPostfix(char infix[], char s2[]) {
        char s1[maxSize];
        // 符号堆栈
        int top1 = -1, top2 = -1;
        // top1是符号堆栈的标号, top2是结果数组的标号
        int stackMax = 0;
        // 记录堆栈最大处的标号
        int i = 0;
        // 指向原数组的标号
        while (infix[i] != '\0')
        // 控制循环的原数组循环的末尾
        {
            if (('a' <= infix[i] && infix[i] <= 'z') ||
                    (('0' <= infix[i] && infix[i] <= '9')))
            // 如果选到数字或者字母, 直接写入结果数组
            {
                s2[++top2] = infix[i];
                i++;
            } else if (infix[i] == '(')
            // 如果遇到左括号, 直接写入符号堆栈
            {
                s1[++top1] = '(';
                if (top1 > stackMax)
                    stackMax = top1;
                i++;
            } else if (infix[i] == '+' || infix[i] == '-' || infix[i] == '*' ||
                                 infix[i] == '/')
            // 如果遇到运算符则分类讨论
            {
                if (top1 == -1 || s1[top1] == '(' ||
                        getPriority(infix[i]) > getPriority(s1[top1]))
                // 若在栈底, 在括号底, 或者操作符优先级高, 则操作符入栈
                {
                    s1[++top1] = infix[i];
                    if (top1 > stackMax)
                        stackMax = top1;
                    i++;
                } else // 否则出栈
                    s2[++top2] = s1[top1--];
            } else if (infix[i] == ')')
            // 如果遇到右括号, 则将其与对应左括号之间的符号出栈
            {
                while (s1[top1] != '(')
                    s2[++top2] = s1[top1--];
                top1--;
                i++;
            }
        }
        while (top1 != -1)
            // 这里将堆栈中剩余的符号推出堆栈
            s2[++top2] = s1[top1--];
        return stackMax + 1;
        // 这里top1是堆栈标号, 必须+1才是数目
    }
    
    int top2 = -1;
    char s2[maxSize];
    char infix[maxSize];
    
    int main() {
        scanf("%s", infix);
        cout << infixToPostfix(infix, s2) << endl;
        int i = 0;
        while (s2[i] != '\0')
            cout << s2[i++];
        cout << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    35
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者