sunkaidong 发表于 2008-4-18 19:09

我尝试过很多组合结果都是对的...

zjl138 发表于 2008-4-18 19:27

[quote][bo]以下是引用 [un]sunkaidong[/un] 在 2008-4-18 19:04 的发言:[/bo]

那个结果问题是我故意的..毕竟我的运算函数只有四个操作符号.....结果有输出啊....没有结果不好判断对错了...呵呵... [/quote]
兄弟你搞错了,我是帮楼主改的程序,不是你的那个,呵呵。。。你的没问题啦。。

sunkaidong 发表于 2008-4-18 19:29

兄弟,不好意思啊.我还以为你说我呢[tk13] 呵呵

zjl138 发表于 2008-4-18 19:30

还有楼主说我的不能运行吗?我的是后缀计算表达式哦,你不要输入搞错了。呵呵。。

firel 发表于 2008-4-19 14:42

ok!!!!!!!!了

谢谢两位啦我已经知道怎么回事了

卧龙孔明 发表于 2008-4-19 17:34

核心就是两个栈
先转换为后缀表达式,然后从中间向外边计算

firel 发表于 2008-4-19 20:27

?????????

版主说话总是这么深奥啊 ??????

qzp19880502 发表于 2008-4-20 14:25

上面的两个程序是不是都是不带括号的,要是带括号该怎么写

上面的两个程序是不是都是不带括号的,要是带括号该怎么写

sunkaidong 发表于 2008-4-20 14:29

仔细看...我的是带括号的.....

写在人生边上 发表于 2008-5-4 22:53

我也写了一个表达式求值的程序,用C写的。有以下功能:  + - * 、 ( )
    1.可以处理负数,若第一个数为负数,则不需要括号;若负数不是第一个数,则需要括号。
    2.可以输入浮点数并计算(double型的)。
    3.可以精确到小数点后6位,若小数点后有多余的零,则输出时,可以屏蔽掉(即不输出0)。
    4.表达式值的范围:-20亿 到 +20亿
    5.除数为0,则输出“除数不能为零”。
    6.若左括号多于或少于右括号,则输出“表达式错误”。
    7.若输入的数据为  1..2+3  或   1.2.3+4  ,则输出“表达式错误”。
    8.若输入的数据为  1.+3  或   .3+4  ,则输出“表达式错误”。
    9.可以处理多层括号。
    10.若输入    1+ 01  ,则输出“表达式错误”。
    11.若只输入一个操作数  或  多层括号中一个操作数  ,则输出 该操作数。
       若只输入操作数  或 操作符,则输出 “表达式错误”。
       若输入的操作数  或 操作符多输了、或少输了, 则输出 “表达式错误”。
       若输入除表达式以外的字符(空格除外),则输出“表达式错误”。
    12.表达式的任何地方都可以输入 空格 。
    13.例:
           输入                        输出
           1/2回车                      0.5
           1/3+2/3回车                   1
           1/3回车                     0.333333
           2/3回车                     0.666667
           -4.0/2.0回车                -2
           -4.0/(-2.0)/(-1.0)回车      -2
   你们评评,看还有哪些功能上的漏洞,过几天,我再把代码上传。

红色兔子 发表于 2008-5-25 11:01

我是这样写的
#include<stdio.h>
#include<conio.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define TRUE 1
#define OK 1
#define FALSE 0
#define OVERFLOW -2
#define ERROR 0
typedef int Status;
typedef char SElemType1;
typedef int SElemType2;
char OP[7]={'+','-','*','/','(',')','#'};
typedef struct
{
    SElemType1 *base;
    SElemType1 *top;
    int stacksize;
}CharStack;
typedef struct
{
    SElemType2 *base;
    SElemType2 *top;
    int stacksize;
}IntStack;
Status initIntStack(IntStack *I)
{
        (*I).base=(SElemType2 *)malloc(STACK_INIT_SIZE*sizeof(SElemType2));
                if(!(*I).base) exit(OVERFLOW);
                (*I).top=(*I).base;
                (*I).stacksize=STACK_INIT_SIZE;
                return OK;
}
Status initCharStack(CharStack *C)
{
        (*C).base=(SElemType1 *)malloc(STACK_INIT_SIZE*sizeof(SElemType1));
                if(!(*C).base) exit(OVERFLOW);
                (*C).top=(*C).base;
                (*C).stacksize=STACK_INIT_SIZE;
                return OK;
}
Status desintStack(IntStack *I)
{
        (*I).top=NULL;
        free((*I).base);
        (*I).base=NULL;
        return OK;
}
Status descharStack(CharStack *C)
{
        (*C).top=NULL;
        free((*C).base);
        (*C).base=NULL;
        return OK;
}
int getinttop(IntStack I)
{
        SElemType2 e;
        if(I.top==I.base) return ERROR;
        e=*(I.top-1);
        return e;
}
char getchartop(CharStack C)
{
        SElemType1 e;
        if(C.top==C.base) return ERROR;
        e=*(C.top-1);
        return e;
}
Status pushchar(CharStack *C,SElemType1 e)
{
        if((*C).top-(*C).base>=(*C).stacksize)
        {
                (*C).base=(SElemType1 *)realloc((*C).base,((*C).stacksize+STACKINCREMENT)*sizeof(SElemType1));
                if(!(*C).base) exit(OVERFLOW);
                (*C).top=(*C).base+(*C).stacksize;
        (*C).stacksize+=STACKINCREMENT;
        }
        *(*C).top++=e;
        return OK;
}
Status pushint(IntStack *I,SElemType2 e)
{
        if((*I).top-(*I).base>=(*I).stacksize)
        {
                (*I).base=(SElemType2 *)realloc((*I).base,((*I).stacksize+STACKINCREMENT)*sizeof(SElemType2));
                if(!(*I).base) exit(OVERFLOW);
                (*I).top=(*I).base+(*I).stacksize;
                (*I).stacksize+=STACKINCREMENT;
        }
        *(*I).top++=e;
        return OK;
}
Status popchar(CharStack *C,SElemType1 *e)
{
        if((*C).top==(*C).base) return ERROR;
        *e=*(--(*C).top);
        return OK;
}
Status popint(IntStack *I,SElemType2 *e)
{
        if((*I).top==(*I).base) return ERROR;
        *e=*(--(*I).top);
        return OK;
}
Status In(char c,char OP[])
{
        int i;
        for(i=0;i<=6;i++)
                if(c==OP[i]) return TRUE;
    return FALSE;
}
int Transfer(char c)
{
        int k;
        switch(c)
        {
            case '+':k=0;break;
            case '-':k=1;break;
            case '*':k=2;break;
            case '/':k=3;break;
            case '(':k=4;break;
            case ')':k=5;break;
            case '#':k=6;break;
        }
    return k;
}
char Precede(char c1,char c2)
{
        int i,j;
        char a[7][7]={{'>','>','<','<','<','>','>'},
                      {'>','>','<','<','<','>','>'},
                      {'>','>','>','>','<','>','>'},
                      {'>','>','>','>','<','>','>'},
                      {'<','<','<','<','<','=',''},
                      {'>','>','>','>','','>','>'},
                      {'<','<','<','<','<','','='}};
        i=Transfer(c1);
        j=Transfer(c2);
        return(a[i][j]);
}
int Operate(int a,char c,int b)
{
        int z;
        switch(c)
        {
             case '+':z=b+a;break;
             case '-':z=b-a;break;
             case '*':z=b*a;break;
             case '/':z=b/a;break;
        }
        return z;
}
int EvaluateExpression()
{
         int flag=0,num,a,b,answer;
         char c,x;
         IntStack NUM;
         CharStack OPTR;
         initCharStack(&OPTR);
         pushchar(&OPTR,'#');
         initIntStack(&NUM);
         c=getchar();
         while(c!='#'||getchartop(OPTR)!='#')
         {
                 if(!In(c,OP))
                 {
                         if(flag==1)
                         {
                                 popint(&NUM,&num);
                                 num=num*10+(c-'0');
                                 pushint(&NUM,num);
                         }
                         else
                         {
                                 pushint(&NUM,c-'0');
                                 flag=1;
                         }
                         c=getchar();
                 }
                 else
                 {
                         switch(Precede(getchartop(OPTR),c))
                         {
                         case '<':pushchar(&OPTR,c);c=getchar();break;
                         case '=':popchar(&OPTR,&x);c=getchar();break;
                         case '>':popchar(&OPTR,&x);
                                  popint(&NUM,&a);
                                      popint(&NUM,&b);
                                          pushint(&NUM,Operate(a,x,b));
                                          break;
                         }/*switch*/
                         flag=0;
                 }
         }/*while*/
         answer=getinttop(NUM);
         desintStack(&NUM);
         descharStack(&OPTR);
         return answer;
}
main()
{
        int loop=1,answer;
        while(loop)
        {
                clrscr();
                printf("\n\n\n\t\tPlease input your biaodashi:(end with '#')");
                answer=EvaluateExpression();
                printf("\n\t\tThe answer is : %d",answer);
                printf("\n\t\tOnce again?(1/0)");
                scanf("%d%*c",&loop);
        }
        printf("\n\n\n\t\tThank you for your useing!");
        getch();
}

满江风 发表于 2008-5-25 16:57

哈哈。我正找这个呢!

页: 1 [2]

编程论坛