| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 617 人关注过本帖
标题:表达式求值代码不知道哪里出错了,帮忙看一下
取消只看楼主 加入收藏
梦荷音
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2009-10-8
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:2 
表达式求值代码不知道哪里出错了,帮忙看一下
这是一个表达式求值的代码,函数功能都差不多了,可是不知道为什么老是报很奇怪的错,我感觉是健壮性不好,可是不知道怎么改,请大家帮忙看一下。
#include<stdio.h>
#define maxsize 100
typedef char DataType;
typedef struct stackNode{
    DataType data;
    struct stackNode *next;
    }StackNode;
typedef struct{
    StackNode *top;
    }LinkNode;
 LinkNode *OPTR,*OPND;
void initStack(LinkNode *S){
    S->top=NULL;
    }
void push(LinkNode *S,DataType x)
    {
        StackNode *p=(StackNode*)malloc(sizeof(StackNode));
        p->data=x;
        S->top->next=p;
        p->next=NULL;
        }
DataType pop(LinkNode *S){
    DataType x;
    StackNode *p=S->top;
    if(stackEmpty(S)) Error("the stack is empty\n");
    x=p->data;S->top->next=p;
    free(p);
    return x;
    }
DataType getTop(LinkNode *S){
    return S->top->data;
    }
int in(DataType c){
    int i;
    char OP[8] = {'+','-','*','/','^','#','(',')'};
    for(i=0;i<8;i++){
        if(c==OP[i])  break;   
    }
    return 1;
    }
DataType precede(DataType a,DataType b){
    char w;
    int i,j;
    int t[8][8]={1,1,-1,-1,-1,-1,1,1,
        1,1,-1,-1,-1,-1,1,1,
        1,1,1,1,-1,-1,1,1,
        1,1,1,1,-1,1,1,1,
        1,1,1,1,1,-1,1,1,
        -1,-1,-1,-1,-1,-1,0,2,
        1,1,1,1,1,2,1,1,
        -1,-1,-1,-1,-1,-1,2,0
        };

            switch(a){
            case '+':i=0;break;
            case '-':i=1;break;
               case '*':i=2;break;
               case '/':i=3;break;
            case '^':i=4;break;
               case '(':i=5;break;
               case ')':i=6;break;
               case '#':i=7;break;}
            switch(b){
            case '+':j=0;break;
            case '-':j=1;break;
               case '*':j=2;break;
               case '/':j=3;break;
            case '^':j=4;break;
               case '(':j=5;break;
               case ')':j=6;break;
               case '#':j=7;break;}
            if(t[i][j]==1)  return'>';
            else if (t[i][j]==0) return'=';
            else if (t[i][j]==-1) return'<';
            }
double operate(DataType a,DataType b,DataType c ){
    double r;int i;
    switch(b){
        case '+': r=a+c;break;
        case '-': r=a-c;break;
        case '*': r=a*c;break;
        case '/': r=a/c;break;
        case '^': for(i=1;i<=c;i++) { r=1.00;r=r*a;}break;
        }
    return ;
    }
double Cal(DataType  *str){
    DataType a,b;
    DataType *p=*str;
    initStack(OPTR); push(OPTR,'#');
    initStack(OPND);
        while(*p!='#' || getTop(OPTR)!='#'){
            if (in(*p))     OPNDPush(OPND,*(p++));
        else{
            switch (Precede(GetTop(OPTR),*p)){
                case '<':       Push(OPTR,*(p++)-'0');
                        break;
                case '=':          Pop(OPTR,*(p++));
                        break;
                          case '>':    Pop(OPTR);
                        b=Pop(OPND);     
                        a=Pop(OPND);
                        Push(OPND,Operate(a,Pop(OPTR),b));  
                        break;
                   }
              }
            }
          return  (double)getTop(OPND);
        
    }
void main(){
    DataType *str[maxsize];
    printf("Please input your expression :/n");
    for(i=0;i<maxsize;i++)    if(&str[i]!='#')  scanf("%c",&str[i]);
    Cal(str);
    printf("The last result is :  %d",Cal(str));
    }
搜索更多相关主题的帖子: 表达 代码 求值 
2009-10-16 22:25
梦荷音
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2009-10-8
收藏
得分:0 
不是啦,是我自己看了一些书改的,有些功能是我自己写的

积极面对人生,相信美好的存在!
2009-10-18 11:28
梦荷音
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2009-10-8
收藏
得分:0 
我还是不太明白,我已经用char去定义DataType了啊,不是可以不判断栈空吗?

积极面对人生,相信美好的存在!
2009-10-18 20:03
快速回复:表达式求值代码不知道哪里出错了,帮忙看一下
数据加载中...
 
   



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

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