zoukankan      html  css  js  c++  java
  • 双栈计算算术表达式

    1.介绍

    算术表达式的计算,是比较常见的问题,但这个问题的背后隐藏着栈的思想。

    这里就介绍使用两个栈来计算表达式的方法。

    2. 算法

    2.1 定义:

    a) 建立两个栈:

    一个是数据栈dataStak,用于存放数据;

    一个是符号栈operatorStack,用于存放运算符;

    b) 建立运算符号之间的优先级表,用于比较两个符号之间的优先级;

    优先级定义为三种运算结果:>(表示高于),<(表示低于),=(表示相等);

    并且对于”(”与”)”,认为两者的优先级相同,不做任何运算;

    2.2 计算条件:

    a) 当同时满足b)c)d)时,可以进行计算;

    b) 当前token为运算符(即不能为字符串结束符或者运算数);

    c) 符号栈非空(因为需要和栈顶元素进行优先级比较);

    d) 符号栈的栈顶元素的优先级 < 当前token;

    最后操作数栈剩余的操作数就是计算的最终结果;

    2.3 优先级符号表

    char[,] priority = new char[6, 6] {
                //+   -    *   /  (   )
                {'>','>','<','<','<','>'}, //+
                {'>','>','<','<','<','>'}, //-
                {'>','>','>','>','<','>'}, //*
                {'>','>','>','>','<','>'}, ///
                {'<','<','<','<','<','='}, //(
                {'<','<','<','<','<','>'}  //)
            };

    2.4伪码

    对于每个token
    if(token是数字)
    {
        dataStack.push(token);
    }
    else
    {
        switch(token与operatorStack栈顶元素进行优先级比较)
        {
            case 大于:
                dataStack.push(token);
                break;
            case 小于:
                运算符=operatorStack.pop();
                a= dataStack.pop();
                b= dataStack.pop();
                    c= a运算符b;
                    dataStack.push(c);
                    break;
            case 等于:
                    dataStack.pop();
                    break;
        }
    }
  • 相关阅读:
    给多个表的Dimension字段赋初值
    第十七章 性能(一)
    终于看到Inside Microsoft Dynamics Ax4.0了
    Snapin
    添加图片
    PHP功能齐全的发送邮件类,可以发送HTML和附件
    js重写的美化版select控件
    纯CSS的下拉菜单 支持IE6 IE7 Firefox
    BluePage通用分页类
    论坛结构改动,URL重写不影响收录地址的访问代码
  • 原文地址:https://www.cnblogs.com/pengzhen/p/4373091.html
Copyright © 2011-2022 走看看