注册 登录
编程论坛 数据结构与算法

表达式求值问题

keep_on 发布于 2012-12-03 20:44, 1208 次点击
完成

[ 本帖最后由 keep_on 于 2012-12-5 18:17 编辑 ]
11 回复
#2
凌云飞翔2012-12-04 13:16
当输入整数的表达式时没有错误,输入小数时不显示。。。。。。
因为:
假设,当输入 2.5*4 时也就是说输入了五个字符,2.5是三个字符而不是一个字符。
明白吗?
#3
azzbcc2012-12-04 14:55
用判断整数的办法判断小数是不行的,数据读取那再想想
#4
keep_on2012-12-04 22:20
回复 2楼 凌云飞翔
那请问一下要怎么改呢?我改了好久也没有改出来。。。
#5
azzbcc2012-12-04 22:58
程序代码:
do
{
    d[i++]=c;
    c=getchar();

 }while(c>='0'&&c<='9'||c=='.');
#6
keep_on2012-12-05 18:12
回复 5楼 azzbcc
你好厉害!你也是财大信管学院的吧?
#7
keep_on2012-12-05 18:17
回复 6楼 keep_on
已解决~~

[ 本帖最后由 keep_on 于 2012-12-30 12:49 编辑 ]
#8
azzbcc2012-12-05 19:30
输入的括号不匹配,当然死循环
#9
一个孩子2012-12-05 21:48
程序代码:
#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct
{
    float *base;
    float *top;
    int stack_size;
}sqstack;//操作数栈的声明
typedef struct
{
    char *base;
    char *top;
    int stack_size;
}Sqstack;//运算符栈的声明
/*

**运算符栈的基本操作
*/
int Initstack1(Sqstack &OPTR)
{
    OPTR.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
    if(!OPTR.base)
        return 0;
    OPTR.top=OPTR.base;
    OPTR.stack_size=STACK_INIT_SIZE;
    return 1;
}
int Push1(Sqstack &OPTR,char e)
{
    if(OPTR.top-OPTR.base>=OPTR.stack_size)
    {
        OPTR.base=(char*)realloc(OPTR.base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(char));
        if(!OPTR.base)
            return 0;
        OPTR.top=OPTR.base+OPTR.stack_size;
        OPTR.stack_size+=STACKINCREMENT;
    }
    *OPTR.top++=e;
    return 1;
}
int Pop1(Sqstack &OPTR,char &e)
{
    if(OPTR.top==OPTR.base)
        return 0;
    else
        e=*--OPTR.top;
    return 1;
}
char getTop1(Sqstack &OPTR)
{
    if(OPTR.top==OPTR.base)
        return 0;
    else
        return (*(OPTR.top-1));
}

/*
** 操作数栈的基本操作
*/
int Initstack(sqstack &S)
{
    S.base=(float *)malloc(STACK_INIT_SIZE*sizeof(float));
    if(!S.base)
        return 0;
    S.top=S.base;
    S.stack_size=STACK_INIT_SIZE;
    return 1;

}
int Push(sqstack &S,float e)
{
    if(S.top-S.base>=S.stack_size)
    {
        S.base=(float *)realloc(S.base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(float));
        if(!S.base)
            return 0;
        S.top=S.base+S.stack_size;
        S.stack_size+=STACKINCREMENT;
    }
    *S.top++=e;
    return 1;
}
int Pop(sqstack &S,float &e)
{
    if(S.top==S.base)
        return 0;
    e=*--S.top;
    return 1;
}
float getTop(sqstack &S)
{
    if(S.top==S.base)
        return 0;
    return(*(S.top-1));
}
int In(char c)
{
    if(c=='+'||c=='-'||c=='*'||c=='/'||c=='#'||c=='('||c==')')//这里不要漏写了,要不然影响结果!
        return 1;
    else
        return 0;

}

char Precede(char a,char b)
{
    int i,j;
    char op[8][8]={{' ','+','-','*','/','(',')','#'},{'+','>','>','<','<','<','>','>'},{'-','>','>','<','<','<','>','>'},{'*','>','>','>','>','<','>','>'},{'/','>','>','>','>','<','>','>'},
    {'(','<','<','<','<','<','=',' '},{')','>','>','>','>',' ','>','>'},{'#','<','<','<','<','<',' ','='}};
    for(i=0;i<8;i++)
    {
        if(a==op[i][0])
            break;
    }
    for(j=0;j<8;j++)
    {
        if(b==op[0][j])
            break;
    }
    return op[i][j];

}
float Operate(float a,char theta,float b)//这个没有错!
{
    float c;
    switch(theta)
    {
    case '+':
        c=a+b;
        break;
    case '-':
        c=a-b;
        break;
    case '*':
        c=a*b;
        break;
    case '/':
        c=a/b;
        break;
    }
    return c;
}
float EvalueateExpression(sqstack OPND,Sqstack OPTR)
{
    char c,x,theta;
    float a,b,i;
    Push1(OPTR,'#');
    c=getchar();
    while(c!='#'||getTop1(OPTR)!='#')
    {
        if(!In(c))
        {
            i=(float)(c-48);
            Push(OPND,i);
            c=getchar();
        }
        else
        {
            switch(Precede(getTop1(OPTR),c))
            {
            case '<':
                Push1(OPTR,c);
                c=getchar();
                break;
            case '=':
                Pop1(OPTR,x);c=getchar();
                break;
            case '>':
                Pop(OPND,b);
                Pop(OPND,a);
                Pop1(OPTR,theta);
                Push(OPND,Operate(a,theta,b));
                break;
            }
        }
    }
    return getTop(OPND);
   

}
int main()
{
    float m;
    Sqstack OPTR;
    sqstack OPND;
    Initstack(OPND);
    Initstack1(OPTR);
    printf("please input a expression end with '#',and the number is between 0-9!\n");
    m=EvalueateExpression(OPND,OPTR);
    printf("结果是:%.2f\n",m);
    return 0;
}
这是我以前写的,跟你共享下
#10
keep_on2012-12-05 21:53
回复 9楼 一个孩子
这个我知道,我已经编出来了这个,我只是想在表达式求值之前判断一下它括号是否匹配,如果不匹配就直接退出,不要计算了,这个根本就没有考虑到表达式有没有匹配,当不匹配的时候就死了
#11
azzbcc2012-12-05 22:07
回复 10楼 keep_on
要检测括号匹配,在入栈前检测
#12
keep_on2012-12-06 13:47
回复 6楼 keep_on
这个我知道,我已经编出来了这个,我只是想在表达式求值之前判断一下它括号是否匹配,如果不匹配就直接退出,不要计算了,这个根本就没有考虑到表达式有没有匹配,当不匹配的时候就死了
1