算符优先算法

为了实现算符优先算法,可以实用两个工作栈。一个称作OPTR,用于寄存运算符;另一个称作OPTNCVD,用于寄存操作数或运算结果。算法的思想是:

1) 首先置操作数栈为空栈,表达式起始符“#”为运算符的栈底元素;

2) 依次读入表达式中每一个字符,若是操作数则进OPND栈,若是运算符,则和OPTR栈的栈顶运算符比较优先权后作相应操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前读入的字符为#

 

SElemType EvaluateExpression() // 算法3.4,

 { // 算术表达式求值的算符优先算法。设OPTR和OPND分别为运算符栈和运算数栈
   SqStack OPTR,OPND;
   SElemType a,b,c,x;
   InitStack(OPTR); // 初始化运算符栈OPTR和运算数栈OPND
   InitStack(OPND);
   Push(OPTR,'\n'); // 将换行符压入运算符栈OPTR的栈底。
   c=getchar(); // 由键盘读入1个字符到c
   GetTop(OPTR,x); // 将运算符栈OPTR的栈顶元素赋给x
   while(c!='\n'||x!='\n') // c和x不都是换行符
   { if(In(c)) // c是7种运算符之一
       switch(Precede(x,c)) // 判断x和c的优先权
       { case'<':Push(OPTR,c); // 运算符栈OPTR的栈顶元素x的优先权低,入栈c
                 c=getchar(); // 由键盘读入下一个字符到c
                 break;
         case'=':Pop(OPTR,x); // x='('且c=')'情况,弹出'('给x(后又扔掉)
                 c=getchar(); // 由键盘读入下一个字符到c(扔掉c原有的')')
                 break;
         case'>':Pop(OPTR,x); // 栈顶元素x的优先权高,弹出运算符栈OPTR的栈顶元素给x。
                 Pop(OPND,b); // 依次弹出运算数栈OPND的栈顶元素给b,a
                 Pop(OPND,a);
                 Push(OPND,Operate(a,x,b)); // 做运算a x b,并将运算结果入运算数栈
       }
     else if(c>='0'&&c<='9') // c是操作数
     { Push(OPND,c-48); // 将该操作数的值(不是ASCII码)压入运算数栈OPND
       c=getchar(); // 由键盘读入下一个字符到c
     }
     else // c是非法字符
     { printf("出现非法字符\n");
       exit(OVERFLOW);
     }
     GetTop(OPTR,x); // 将运算符栈OPTR的栈顶元素赋给x
   }
   Pop(OPND,x); // 弹出运算数栈OPND的栈顶元素(运算结果)给x(修改此处)
   if(!StackEmpty(OPND)) // 运算数栈OPND不空(运算符栈OPTR仅剩'\n')
   { printf("表达式不正确\n");
     exit(OVERFLOW);
   }
   return x;
 }

 void main()
 {
   printf("请输入算术表达式(输入的值要在0~9之间、");
   printf("中间运算值和输出结果在-128~127之间)\n");
   printf("%d\n",EvaluateExpression()); // 返回值(8位二进制,1个字节)按整型格式输出
 }

 

转载于:https://www.cnblogs.com/ottox/archive/2009/04/16/1436977.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值