表达式求值简单版
我要参与
表达式求值简单版

表达式求值简单版

栈在表达式计算过程中的应用 :建立操作数栈和运算符栈。运算符有优先级。规则:

  • 自左至右扫描表达式,凡是遇到操作数一律进操作数栈。

  • 当遇到运算符时,如果它的优先级比运算符栈栈顶元素的优先级高就进栈。反之,取出栈顶运算符和操作数栈栈顶的连续两个操作数进行运算,并将结果存入操作数栈,然后继续比较该运算符与栈顶运算符的优先级。
    图片描述

PPT课件链接:

提取码:r31j

思路:

思考:如果我想要用栈实现下列公式的计算,该怎么办?
(注:这里先不考虑空格问题)
//1+123*5;
char buf[1024];

思考:"123"如何转换成整型数123?
答案:
int data = 0;
for(i = 0;i < 3;i++){
data = data * 10 + buf[i] - '';
}


思路:
1、创建两个栈
linkstack * operand ;//运算数栈
linkstack * operator; //运算符栈

2、扫描表达式。
<1>若是运算数,合并成一个完整的数data。
规则:直接入操作数栈
push_stack(operator_stack,data);

<2>若是操作符(考虑优先级问题)
规则:1、栈为空,直接入栈
                  2、当前的运算符号优先级 == 栈顶符合的优先级
                  直接从运算数栈中取出两个数,再取出栈顶符号。
                  把计算的结果入运算数栈,然后再把当前的运算符
                  入符号栈。
                  (例如:1 + 2 + 4 - 2中,1和2入数据栈,+入符号
                          栈,比较+和-优先级一样,则计算1+2= 3.
                          然后结果3入栈,4入栈,+入栈。再次计算)
                  3、当前的运算符号优先级 >栈顶符合的优先级
                          不要计算,把当前符号直接再次入栈,此时栈顶元素为
                          当前符号,然后再把数据入栈,当新的符号来的时候,
                          比较符号和栈顶元素,若是小于栈顶元素的话,则计算。
                  (例如:1 + 2 * 3-4,1和2入栈,+入栈,然后判断*和+的
                          优先级,* > + ,*入栈,3 入栈, 然后判断-和*
                          的优先级,则- < *,则计算2 和3出栈,*出栈,计算
                          2 * 3 = 6,然后6入栈,在计算+ 和 -的优先级,一样
                          则,计算1 + 6 = 7,然后7入栈,4入栈,-入栈,依次计算)
                          
提示:
1、获得优先级函数
int get_level(char operator)
{
        switch(operator)
        {
        case '+':
        case '-':
                return 1;
        case '*':
        case '/':
                return 2;

        defalut:
                printf("Invalid operator : %c.
",operator);
                return -1;
        }
}       

2、计算+、-、*、/函数
//参数说明:
//opd 运算数
//opt 运算符
int compute(linkstack *opd,linkstack *opt)
{
                int data,data1,data2;
                char c = 0;
                data2 = pop_stack(opd); //运算数2出栈
                data1 = pop_stack(opd);//运算数1出栈
                
                c = pop_stack(opt); //运算符出栈
                
                switch(c)
                {
                                case '+':
                                data = data1 + data2;
                                break;
                                ......
                }
                

                push_satck(data,opd);//把最后获得的运算数入栈。
}

3、得到最终结果的条件:
当扫描结果的时候,判断运算符栈是否为空,
若是为空则计算,若是不为空,则为空,则
操作数栈中的结果,为我们最后的结果。

4、主函数框架

char buf[1024];
char *p = buf;
int data = 0; //运算数
//输入数据到buf中

while(*p != '')
{
        //获得运算数
        if(*p >= '0' && *p <= '9')
        {
                        data = 0;                
        
                //获得运算数
                
                //入运算数栈
                
                continue;
        }
        
        if(*p == '+' || *p == '-' .....)
        {
                        //处理运算符
                        deal_with(operand,operator,*p);
                        p++;
                        continue;
        }
                        
}
去发布

登录后即可发布作业,立即

我的作业

全部作业

微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师