RodneyX

博客园 首页 新随笔 联系 订阅 管理

这个没什么好说的,规则很清晰,代码注释里说明白了,就看你记不记得住这几条规则了。另外作者没学过编译原理,所以只能写这种简陋的东西。不过还是希望能给初学者带来帮助。

#include <stdio.h>
#include <stdlib.h>
// We assume that s[] is an legal expression and operands are letters like 'a' 'b' etc.
// 若为'('入栈
// 若为')'把所有'('之前出栈且删除'('
// 若为运算符:
//'*' 或 '/'
// 栈顶一直弹出直到遇到 '+' 或 '-' 或 '(' 或空栈然后入栈
//'+' 或 '-'
// 栈顶一直弹出直到遇到 '(' 或空栈
// 最后,把整个栈弹空,这些元素依次加到后缀表达式后即可得到最终结果
void infixToRPN(char *s)
{
    int slen = 0;
    while (s[slen] != '\0')
        ++slen;

    int RPNlen = 0;
    char *stack = (char *)malloc(sizeof(char) * slen);
    int top = -1;
    for (int i = 0; i < slen; ++i)
    {
        if ('(' == s[i])
            stack[++top] = '(';
        else if (')' == s[i])
        {
            while (top > -1 && '(' != stack[top])
                s[RPNlen++] = stack[top--];
            --top; // discard '('
        }
        else
        {
            if ('*' == s[i] || '/' == s[i])
            {
                while (top > -1 && ('*' == stack[top] || '/' == stack[top]))
                    s[RPNlen++] = stack[top--];
                stack[++top] = s[i];
            }
            else if ('+' == s[i] || '-' == s[i])
            {
                while (top > -1 && stack[top] != '(')
                    s[RPNlen++] = stack[top--];
                stack[++top] = s[i];
            }
            else
            {
                s[RPNlen++] = s[i];
            }
        }
    }
    while (top > -1)
        s[RPNlen++] = stack[top--];
    s[RPNlen] = '\0';
    free(stack);
}

int main(void) {
    char s[] ="a+((b*c-d)/(e-f)*g)+h";
    printf("infix: %s\n", s);
    infixToRPN(s);
    printf("  RPN: %s\n", s);
    return 0;
}
posted on 2025-08-18 19:50  RodneyX  阅读(7)  评论(0)    收藏  举报