| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 617 人关注过本帖
标题:表达式求值代码不知道哪里出错了,帮忙看一下
只看楼主 加入收藏
梦荷音
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2009-10-8
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
表达式求值代码不知道哪里出错了,帮忙看一下
这是一个表达式求值的代码,函数功能都差不多了,可是不知道为什么老是报很奇怪的错,我感觉是健壮性不好,可是不知道怎么改,请大家帮忙看一下。
#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
sen_lin
Rank: 6Rank: 6
等 级:侠之大者
威 望:3
帖 子:114
专家分:436
注 册:2009-3-24
收藏
得分:4 
你这是不是在某本数据结构的书上抄下来的啊?
2009-10-17 12:03
梦荷音
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2009-10-8
收藏
得分:0 
不是啦,是我自己看了一些书改的,有些功能是我自己写的

积极面对人生,相信美好的存在!
2009-10-18 11:28
sen_lin
Rank: 6Rank: 6
等 级:侠之大者
威 望:3
帖 子:114
专家分:436
注 册:2009-3-24
收藏
得分:4 
你并没有把数据结构中的算法完全转换成程序代码,你的那些称之为伪代码,就像DataType,应该是具体的数据类型,如int、char等了。还有stackEmpty(S)是不是判断栈空的,这个功能你也没有用函数或语句实现啊,所以才会有你说的那样奇怪的错误!
2009-10-18 18:23
梦荷音
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2009-10-8
收藏
得分:0 
我还是不太明白,我已经用char去定义DataType了啊,不是可以不判断栈空吗?

积极面对人生,相信美好的存在!
2009-10-18 20:03
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:6 
// 看了下堆栈

#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 Error(char * s)    // 我加的函数
{
    puts(s);
    exit(1);
}
 
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;     // 问题1
    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;   // 问题2
    free(p);
    return x;
}
 
DataType getTop(LinkNode *S)
{
    return S->top->data; // 问题3
}



—>〉Sun〈<—
2009-10-19 17:45
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:6 
int in(DataType c)
{
    int i;
    char OP[9] = "+-*/^#()";
    for(i = 0; i < 8; i++) {
        if(c == OP[i])   
            break;  //
    }                       //
    return 1;               // 问题4
}



还没看明白  cal()  ,我根本不知道这个能计算何种表达式。

—>〉Sun〈<—
2009-10-19 19:42
快速回复:表达式求值代码不知道哪里出错了,帮忙看一下
数据加载中...
 
   



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

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