| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2676 人关注过本帖
标题:表达式求值关于中缀式转后缀式的问题!
只看楼主 加入收藏
Edwardwang03
Rank: 2
来 自:西安
等 级:论坛游民
帖 子:45
专家分:32
注 册:2012-9-18
结帖率:50%
收藏
已结贴  问题点数:10 回复次数:6 
表达式求值关于中缀式转后缀式的问题!
本人看资料的时候遇到一段代码,这段代码中转为后缀式的优先级那句不明白,请大神赐教,代码如下(c语言)
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 99
void translate(char str[],char exp[])   /*将算术表达式转换成后缀表达式*/
{
       struct
       {
              char data[MaxSize];
              int top;                  /*top为栈顶*/
       }op;                             /*定义一个含data和top的结构体*/
       char ch;                     
       int i = 0,t = 0;
       op.top = -1;
       ch = str[i];                       /*将str的每一个数转换成ch*/
       i++;
       while(ch != '\0')                  /*ch对应不同的符号的时候对应的转换情况*/
       {
              switch(ch)
              {
              case '(':                 /*当是(的时候,将此括号存入栈op*/
                     op.top++;op.data[op.top]=ch;
                     break;
              case ')':               
                     while(op.data[op.top] != '(')     /*括号内的转换优先级最高,故先提取表达式*/
                     {
                            exp[t]=op.data[op.top];
                            op.top--;
                            t++;
                     }
                     op.top--;
                     break;
              case '+':
              case '-':
                     while(op.top != -1&&op.data[op.top] != '(')
                     {
                            exp[t] = op.data[op.top];
                            op.top--;
                            t++;
                     }
                     op.top++;            /*恢复可插入位置*/
                     op.data[op.top] = ch;
                     break;
              case '*':
              case '/':
                     while(op.top == '/'||op.top == '*')       /*优先级*/
                     {
                            exp[t] = op.data[op.top];
                            op.top--;
                            t++;
                     }
                     op.top++;
                     op.data[op.top] = ch;
                     break;
              case ' ':                         /*忽略空格,排除误操作*/
                     break;
              default:
                     while(ch >= '0'&&ch <= '9')
                     {
                            exp[t] = ch;t++;
                            ch = str[i];i++;
                     }
                     i--;
                     exp[t] = '#';              /*分隔操作数,为了美观,也为了以后好分隔操作数,呵呵*/
                     t++;
              }
              ch = str[i];
              i++;
       }
       while(op.top != -1)                   /*得到剩下的部分*/
       {
              exp[t] = op.data[op.top];
              t++;
              op.top--;
       }
       exp[t] = '\0';                         /*表达式结束*/
}
float cal_value(char exp[])
{
       struct
       {
              float data[MaxSize];
              int top;
       }st;                                /*操作数栈*/
       float d;
       char ch;
       int t = 0;
       st.top = -1;
       ch = exp[t];
       t++;
       while(ch != '\0')
       {
              switch(ch)                  /*运算主体*/
              {
               case '+':
                      st.data[st.top-1] = st.data[st.top-1]+st.data[st.top];
                      st.top--;
                      break;
               case '-':
                      st.data[st.top-1] = st.data[st.top-1]-st.data[st.top];
                      st.top--;
                      break;
               case '*':
                      st.data[st.top-1] = st.data[st.top-1]*st.data[st.top];
                      st.top--;
                      break;
               case '/':
                       if(st.data[st.top] != 0)
                              st.data[st.top-1]=st.data[st.top-1]/st.data[st.top];
                       else
                       {
                              printf("\n\t除0是错误的");
                       }
                       st.top--;
                       break;
               default:
                      d=0;
                      while(ch >= '0'&&ch <= '9')       /*从后缀表达式中获取操作数,#作用在此体现*/
                      {
                             d = 10*d+ch-'0';
                             ch = exp[t];
                             t++;
                      }
                      st.top++;
                      st.data[st.top] = d;
            }
            ch = exp[t];
            t++;
       }
       return st.data[st.top];
}
int main()                                   /*可以提到前面去*/
{
       char str[MaxSize],exp[MaxSize];       /*str为算术表达式,exps为后缀表达式*/
       printf("请输入一个求值表达式\n");
       printf("表达式:");
       gets(str);                            /*输入一个算术表达式*/
       printf("原表达式是:%s\n",str);
       translate(str,exp);                   /*将算术表达式转换成后追表达式*/
       printf("&&&&&&&&&&&");///
       printf("后缀表达式:%s\n",exp);
       printf("计算结果:%g\n",cal_value(exp));/*通过后缀表达式来求值*/
       system("pause");
       return 0;
}
搜索更多相关主题的帖子: 结构体 表达式 include top 
2012-09-22 18:19
Edwardwang03
Rank: 2
来 自:西安
等 级:论坛游民
帖 子:45
专家分:32
注 册:2012-9-18
收藏
得分:0 
回复 楼主 Edwardwang03
本人就是不明白他的优先性怎么判断的
2012-09-22 18:20
Edwardwang03
Rank: 2
来 自:西安
等 级:论坛游民
帖 子:45
专家分:32
注 册:2012-9-18
收藏
得分:0 
回复 楼主 Edwardwang03
求大神呀
2012-09-22 18:33
兔bug
Rank: 2
等 级:论坛游民
帖 子:10
专家分:12
注 册:2012-9-22
收藏
得分:10 
while(op.top == '/'||op.top == '*')     先判断后或(||),如果 op.top == '/'表达式为真则后面的不执行判断
2012-09-22 19:36
Edwardwang03
Rank: 2
来 自:西安
等 级:论坛游民
帖 子:45
专家分:32
注 册:2012-9-18
收藏
得分:0 
回复 4楼 兔bug
这种情况到底是什么意思
2012-09-24 18:54
赖哈么
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-11-21
收藏
得分:0 
有负数情况结果就错了!可不可以遇到负数就预设零进栈?
2012-11-21 06:50
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
学习

我要成为嘿嘿的黑客,替天行道
2012-11-21 07:16
快速回复:表达式求值关于中缀式转后缀式的问题!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023868 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved