用栈实现简单表达式求值

用栈实现简单表达式求值

准备

建立两个栈:操作数栈+操作符栈

步骤

没有括号的情况

注意:弹出时两个操作数的顺序要反一下,以确保运算的顺序和输入的顺序一致

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
while(从左到右读入操作数/操作符)
{
    if(is 操作数x)
    {
        操作数栈.push(x);
    }
    if(is 操作符op)
    {
        while(优先级: op <= 操作符栈.top)
        {
            opt=操作符栈.top
            操作符栈.pop;
            b=操作数栈.top;操作数栈.pop;   
            a=操作数栈.top;操作数栈.pop;
            操作数栈.push( 运算: a opt b );
        }
        操作符栈.push(op);
    }
}

处理括号

对于’(’:遇到时就加入操作符栈

对于’)’:遇到时不断弹出操作符和操作数,直到操作符栈顶为’)‘时将它弹出。(也就是计算这两个括号之间的表达式)

处理负号

‘-‘既可以看做是减号又可以看做是负号。

判断负号

如果负号是第一个字符或者前一个字符是’(’,那么它就是负号。

处理负号

  1. 负号后面是一个操作数:读入之后取负。
  2. 负号后面是括号:将整个括号内的表达式计算完之后取负。

首尾处理

为了保证计算结束时操作数栈中只有一个值,可以在读入表达式后在表达式的首尾用一对括号包裹。

例题

  1. 黑科技::计算器

  2. NOIP2013普及表达式求值

参考资料

O_O

0%