栈、计算表达式

利用栈的先进后出的特点 计算表达式

这里写一个简单的计算0-9内的计算

表达式里面分为数字和运算符,应该定义两个栈, OPDN栈存数字,OPDR栈存运算符。

栈、计算表达式_第1张图片

这里把运算符放入oper 数组中。表达式结束标志为‘#’

定义链栈并初始化

栈、计算表达式_第2张图片

入栈和出栈

栈、计算表达式_第3张图片

获取栈顶元素

栈、计算表达式_第4张图片

这里获取栈顶元素的作用是当我们计算出一个表达式的值或者括号内的值后会被存入OPDN栈中

所以直接返回栈顶元素就是我们的计算结果。

*下面是运算符的优先级*

栈、计算表达式_第5张图片

topch是运算符栈 OPDR中的栈顶运算符,ch是我们现在所扫描的运算符。例如 topch现在是左括号(.

而我们现在的ch 是‘+’号,那么就说( 优先级是低于 + 的。如果优先级为 <,那么就继续把当前的ch运算符

存入OPDR栈中。如果是>,就从OPDN栈中取出两个数字,再从OPDR栈中取出一个运算符,对他们进行计算,

然后把结果存入OPDN栈中。

栈、计算表达式_第6张图片

计算:因为data为char类型,所以计算是要加上48.

栈、计算表达式_第7张图片

 

 这里是具体的运算。再开始前我们就已经把左#压入OPDR栈中了,表达式结尾输入#结束

char EvaluateExpression()
{
    LinkStack OPND, OPTR;
    SElemType ch, theta, a, b, x;
    InitStack(OPTR);
    InitStack(OPND);
    Push(OPTR, '#');
    cin >> ch;
    while (ch != '#' || GetTop(OPTR) != '#')
    {
        if (!In(ch)) {//数字
            Push(OPND, ch);
            cin >> ch;
        }
        else
            switch (Precede(GetTop(OPTR), ch))
            {
            case'<':
                Push(OPTR, ch);
                cin >> ch;
                break;
            case'>':
                Pop(OPTR, theta);
                Pop(OPND, b);
                Pop(OPND, a);
                Push(OPND, Operate(a, theta, b));
                break;
            case'=':                      //OPTR栈顶是(, 且ch是 )
                Pop(OPTR, x);             //弹出OPTR的(,并读入下一个字符
                cin >> ch;
                break;
            }
    }
    return GetTop(OPND);
}

结果:

栈、计算表达式_第8张图片

 

转载于:https://www.cnblogs.com/cjwen/p/10666157.html

你可能感兴趣的:(栈、计算表达式)