Expression Evaluation(表达式求值)

来源:互联网 发布:淘宝买家怎么发布微淘 编辑:程序博客网 时间:2024/06/05 22:15

20080927

数据结构中栈的应用。

#include<ctype.h>
#include<stdio.h>
#include<stdlib.h>
#include<bios.h>
typedef struct stack
{
    union
    {
        float value;
        char sign;
    }data;
    struct stack *down;
}ST;
void finish(ST *topv);
void c2(ST **ptopv,ST **ptops);
void error();
ST *compute(ST *a,char sign,ST *b);
void push(ST **ptop,ST *in);
ST *pop(ST **ptop);
char *read(ST *r,char *class,char *ch);
char convert(char sign);
void rsgs(char *p,char max);
int rsgc();
void option(ST **ptopv,ST **ptops,ST *cu,char *pclass);
void main()
{
    ST *topv=0,*tops=0,*cu;
    char ch[71],class,*p=ch;
    printf("\n Expression Evaluation V20080928 by roundsheep");
    printf("\n\n Max String:70");
    printf("\n\n Max Significant Digits:6");
    printf("\n\n Max Decimal Digits:5");
    printf("\n\n Can only use the digit or +-*/()");
    printf("\n\n Please input expression:\n\n ");
    rsgs(ch,70);
    while(1)
    {
        cu=(ST *)malloc(sizeof(ST));
        p=read(cu,&class,p);
        if(p==0||cu==0)error();
        option(&topv,&tops,cu,&class);
        if(*p==0)
        {
            while(tops!=0)c2(&topv,&tops);
            if(tops==0&&topv->down==0)finish(topv);
            else error();
        }
    }
}

ST *compute(ST *a,char sign,ST *b)
{
    switch(sign)
    {
        case '+':a->data.value+=b->data.value;break;
        case '-':a->data.value-=b->data.value;break;
        case '*':a->data.value*=b->data.value;break;
        case '/':a->data.value/=b->data.value;
    }
    return a;
}
void push(ST **ptop,ST *in)
{
    in->down=*ptop;
    *ptop=in;
}
ST *pop(ST **ptop)
{
    ST *t;
    if(*ptop==0)return 0;
    t=*ptop;
    *ptop=(*ptop)->down;
    return t;
}
char *read(ST *r,char *pclass,char *ch)
{
    float b;
    switch(*ch)
    {
        case '+':
        case '-':
        case '*':
        case '/':
        case '(':
        case ')':
            r->data.sign=*ch;
            *pclass='s';
            return ch+1;
    }
    if(!isdigit(*ch))return 0;
    *pclass='v';
    for(r->data.value=0;isdigit(*ch);ch++)
    {
        r->data.value*=10;
        r->data.value+=*ch-48;
    }
    if(*ch!='.')return ch;
    ch++;
    if(!isdigit(*ch))return 0;
    for(b=10;isdigit(*ch)&&b<10e6;ch++,b*=10)
    r->data.value+=(*ch-48)/b;
    return ch;
}
char convert(char sign)
{
    char c;
    switch(sign)
    {
        case '+':c=0;break;
        case '-':c=1;break;
        case '*':c=2;break;
        case '/':c=3;break;
        case '(':c=4;break;
        case ')':c=5;
    }
    return c;
}
void error()
{
    printf("\n\n Error!");
    rsgc();
    exit(0);
}
void c2(ST **ptopv,ST **ptops)
{
    ST *com1,*com2;
    com2=pop(ptopv);
    com1=pop(ptopv);
    if(com1==0)error();
    com1=compute(com1,pop(ptops)->data.sign,com2);
    push(ptopv,com1);
}
void finish(ST *topv)
{
    printf("\n\n Result:\n\n %.3f",topv->data.value);
    rsgc();
    exit(0);
}
int rsgc()
{
    int c=0,key;
    key=bioskey(0);
    switch(key)
    {
        case 11779:c=6;exit(0);/* quit */
        case 3592:c=5;break;/* backspace */
        case 7181:c=10;break;/* enter */
        case 18432:c=1;break;/* up down left right */
        case 20480:c=2;break;
        case 19200:c=3;break;
        case 19712:c=4;break;
    }
    if(c)return c;
    return key&0xff;
}
void rsgs(char *p,char max)
{
    char s=max;
    do
    {
        do
        {
        *p=rsgc();
      }while(*p==5&&s==max||*p!=10&&*p!=5&&s==0);
      if(*p==5)
      {
        printf("\b \b");
        s+=2;
        p-=2;
      }
        else if(*p==10){*p=0;return;}
        else if(*p>=33&&*p<=126)putchar(*p);
        else putchar(' ');
        p++;
    }while(s--);
    *--p=0;
}
void option(ST **ptopv,ST **ptops,ST *cu,char *pclass)
{
    char t,cp[6][6]=
    {
        {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},
        {-1,-1,-1,-1,-2,1}
    };
    if(*pclass=='v'){push(ptopv,cu);return;}
    if(*ptops==0){push(ptops,cu);return;}
    t=cp[convert((*ptops)->data.sign)][convert(cu->data.sign)];
    switch(t)
    {
        case -2:error();
        case 0:pop(ptops);break;
        case -1:push(ptops,cu);break;
        case 1:{c2(ptopv,ptops);option(ptopv,ptops,cu,pclass);}
    }
}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 心脏支架又堵了怎么办 车辆验车过期了怎么办 车辆年审过期2天怎么办 违停单子丢了怎么办 沙发弹簧包坏了怎么办 bt种子被和谐了怎么办 苹果手机id密码忘了怎么办 墙漆颜色太深了怎么办 油漆颜色太深了怎么办 墙面漆颜色太深怎么办 古代打仗牙掉了怎么办 乐视电视没声音怎么办 老公疑心病很重怎么办啊 被安装了尿道锁怎么办 狼青小狗腿罗圈怎么办 备孕期间有霉菌怎么办 虫子进皮肤里了怎么办 生完孩子肚子越来越大怎么办 怀孕8个月肚子小怎么办 孕晚期胎儿不长怎么办 肚子上肉特别多怎么办 奶堵了有硬块怎么办 便秘5天肚子胀怎么办 上火大便拉不出来怎么办 大便拉不出来肚子痛怎么办 戒奶奶涨有硬块怎么办 忌奶的时候涨奶怎么办 娃儿隔奶,,奶涨怎么办 狗肚子很大很鼓怎么办 注册不了的二建怎么办 专升本没考过怎么办 警察乱拘留人该怎么办 玩英雄联盟太卡怎么办 一方离婚证丢了怎么办 遭遇呼死你软件怎么办 开车遇见碰瓷的怎么办 遇到碰瓷老人的怎么办 睿强遥控锁坏了怎么办 地暖分水器坏了怎么办 京东赠品无货怎么办 图书馆的书丢了怎么办