梦殇国际

标题: 表达式求值问题,求帮忙,新手求罩!!!! [打印本页]

作者: long8855381    时间: 2014-4-2 22:48
标题: 表达式求值问题,求帮忙,新手求罩!!!!
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<conio.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct{
        char *top;
        char *base;
        int stacksize;
}Sqstack;
void Initstack(Sqstack *S)
{
        S->base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
        if(!S->base)
                exit(-1);
        S->top=S->base;
        S->stacksize=STACK_INIT_SIZE;
}
int StackEmpty(Sqstack *S)
{
        if(S->top==S->base)
                return 1;
        else
                return 0;
}
char GetTop(Sqstack *S)
{
        char E;
        if(StackEmpty(S))
                return 0;
        E=*S->top-1;
        return E;
}
void Push(Sqstack *S,char e)
{
        if(S->top-S->base>=S->stacksize)
        {
                S->base=(char*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(char));
                if(!S->base)
                        exit(-1);
                S->top=S->base+S->stacksize;
                S->stacksize+=STACKINCREMENT;
        }
        *S->top++=e;
}
void Pop(Sqstack *S,char *e)
{
        if(S->top==S->base)
                printf("ERROR!");
        *e=*S->top--;
}
char Precede(char A,char B)
{
        char a=A,b=B;
        if((a=='+'||a=='-')&&(b=='+'||b=='-'||b==')'||b=='#'))
                return '>';
        else if((a=='+'||a=='-')&&(b=='*'||b=='/'||b=='('||b=='#'))
                return '<';
        else if((a=='*'||a=='/')&&(b=='*'||b=='/'||b==')'||b=='#'||b=='+'||b=='-'))
                return '>';
        else if((a=='*'||a=='/')&&b=='(')
                return '>';
        else if(a=='('&&(b=='*'||b=='/'||b=='('||b=='+'||b=='-'))
                return '<';
        else if(a=='('&&b==')')
                return '=';
        else if(a==')'&&(b=='*'||b=='/'||b==')'||b=='+'||b=='-'||b=='#'))
                return '>';
        else if(a=='#'&&(b=='*'||b=='/'||b=='('||b=='+'||b=='-'))
                return '<';
        else if(a=='#'&&b=='#')
                return '=';
        else
                return '!';
}
int In(char e)
{
        if(e=='+'||e=='-'||e=='*'||e=='/'||e=='('||e==')'||e=='#')
                return 1;
        else
                return 0;
}
int Operate(int M,char F,int N)
{
        if(F=='+')
                return (N-48)+(M-48);
        else if(F=='-')
                return (N-48)-(M-48);
        else if(F=='*')
                return (N-48)*(M-48);
        else if(F=='/')
                return (N-48)/(M-48);
        else return 0;

}
int evaluate(Sqstack *P)
{
        char h=0,pl=0;
        char X=0,Y=0,sum=0;
        Sqstack Q;
        Initstack(&Q);
        while(P->top!=P->base)
        {
                Pop(P,&h);
                Push(&Q,h);
        }
        while(Q.top!=Q.base)
        {
                Pop(&Q,&pl);
                if(!In(pl))
                        Push(P,pl);
                else{
                        Pop(P,&X);Pop(P,&Y);
                        Push(P,(char)Operate(X,pl,Y));
                }
        }
        Pop(P,&sum);
        return        sum;
}
void Disp(Sqstack *S)
{
        while(S->top!=S->base)
                printf("%c",S->base++);
}
void Transexpression()
{
        char ch,x=0,y=0;
        Sqstack OPTR,HZ;
        Initstack(&HZ);Initstack(&OPTR);
        Push(&OPTR,'#');
        ch=getchar();
        while(ch!='#'||GetTop(&OPTR)!='#')
        {
                if(!In(ch))
                {
                        Push(&HZ,ch);ch=getchar();
                }
                else
                        switch(Precede(GetTop(&OPTR),ch))
                        {
                                case '<':Push(&OPTR,ch);ch=getchar();break;
                                case '=':Pop(&OPTR,&x);ch=getchar();break;
                                case '>':Pop(&OPTR,&y);Push(&HZ,y);ch=getchar();break;
                                default :break;
                        }
        }
        Disp(&HZ);
}
void main()
{
        printf("Please input exepression and endup with a '#':");
        Transexpression();
}



作者: 帅比    时间: 2014-4-2 22:48
完全看不懂

作者: Clelo。    时间: 2014-4-2 22:48
TT没学过 对不起

作者: 铁血女汉子    时间: 2014-4-2 22:49
没懂。。艾特大神吧@大神

作者: 右手    时间: 2014-4-2 22:50
这个看不懂,没学这么深奥的呢

作者: long8855381    时间: 2014-4-2 22:50
帅比 发表于 2014-4-2 22:48
完全看不懂

我写得太乱了吧?

作者: hey    时间: 2014-4-2 22:52
没懂

作者: 帅比    时间: 2014-4-2 22:52
long8855381 发表于 2014-4-2 22:50
我写得太乱了吧?

可能是的

作者: long8855381    时间: 2014-4-2 22:54
Clelo。 发表于 2014-4-2 22:48
TT没学过 对不起

没关系~~

作者: long8855381    时间: 2014-4-2 22:56
铁血女汉子 发表于 2014-4-2 22:49
没懂。。艾特大神吧@大神

大神在哪呢。。

作者: long8855381    时间: 2014-4-2 22:57
右手 发表于 2014-4-2 22:50
这个看不懂,没学这么深奥的呢

额,我自己再想想吧。

作者: long8855381    时间: 2014-4-2 22:58
hey 发表于 2014-4-2 22:52
没懂

呵呵,别这么萌。。

作者: smoke    时间: 2014-4-2 22:59
略屌

作者: long8855381    时间: 2014-4-2 23:01
smoke 发表于 2014-4-2 22:59
略屌

求帮忙解决

作者: smoke    时间: 2014-4-2 23:01
long8855381 发表于 2014-4-2 23:01
求帮忙解决

我完全看不懂

作者: 阿兀    时间: 2014-4-2 23:03
辣四什么玩意儿 吓我一跳

作者: 朝阳    时间: 2014-4-2 23:46
。。完全看不懂

作者: 家里虐    时间: 2014-4-3 00:03
这是什么

作者: kris受    时间: 2014-4-3 00:22
提示: 作者被禁止或删除 内容自动屏蔽
作者: 大神    时间: 2014-4-3 17:27
long8855381 发表于 2014-4-2 22:56
大神在哪呢。。

鄙人不懂,建议去程序爱好者社区发帖

作者: 小B    时间: 2014-4-3 20:53
本帖最后由 小B 于 2014-4-3 22:48 编辑

算个不知什么长宽,然后各种输出给写这么复杂,C大神膜拜也!

作者: 七神    时间: 2014-4-3 21:30
木有学过!




欢迎光临 梦殇国际 (https://714.hk/) Powered by Discuz! X3.4