表达式求值

#include<stdio.h>
#define TRUE 1
#define FALSE 0
typedef int Element;
typedef struct Node
{
    Element data;
    struct Node *next;
} StackNode,*LinkStack;
//初始化
LinkStack InitLinkStack(LinkStack top)
{
    top = (LinkStack)malloc(sizeof(StackNode));
    top->next=NULL;
    return top;
}
int PushLinkStack(LinkStack top,Element x)
{
    LinkStack p;
    p=(LinkStack)malloc(sizeof(StackNode));
    if(!p)return FALSE;
    p->data=x;
    p->next=top->next;
    top->next=p;
}
int PopLinkStack(LinkStack top,Element *x)
{
    LinkStack p;
    if(top->next==NULL)return FALSE;
    p=top->next;
    *x=p->data;
    top->next=p->next;
    free(p);
    return TRUE;
}
char getTop(LinkStack top)
{
    if(top->next)
        return top->next->data;
    return '.';
}
int IsEpty(LinkStack S)
{
    if(!S->next)return TRUE;
    return FALSE;
}
int getint(char a)
{
    int i;
    switch(a)
    {
    case '+':
        i = 0;
        break;
    case '-':
        i = 1;
        break;
    case 'x':
        i = 2;
        break;
    case '/':
        i = 3;
        break;
    case '(':
    case '[':
        i = 4;
        break;
    case ')':
    case ']':
        i = 5;
        break;
    case '@':
        i = 6;
        break;
    }
    return i;
}
int priority(char a,char b)
{
    int prio[7][7] = {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,3,
                      1,1,1,1,3,1,1,
                      -1,-1,-1,-1,-1,3,0
                     };
    return prio[getint(a)][getint(b)];
}
void pri(StackNode p)
{
    while(p.next)
    {
        p=*(p.next);
        printf("%d ",p.data);
    }
    printf("\n");
}
int main()
{
    int i,j,p,a,b,num;
    char str[100],d;
    LinkStack op,optr;
    op=InitLinkStack(op);
    optr=InitLinkStack(optr);
    gets(str);
    PushLinkStack(optr,'@');
    for(i=0; ; i++)
    {
        if(IsEpty(optr))break;
        if(str[i]>='0'&&str[i]<='9')
        {
            num=(int)(str[i]-48);
            for(j=i+1;; j++)
            {
                if(str[j]<'0'||str[j]>'9')break;
                num*=10;
                num+=(int)(str[j]-48);
            }
            i=j-1;
            PushLinkStack(op,num);
        }
        else
        {
            p=priority(getTop(optr),str[i]);
            if(p==-1)
                PushLinkStack(optr,str[i]);
            else if(p==1)
            {
                if(getTop(optr)!='@')
                {
                    a=0;b=0;
                    PopLinkStack(op,&a);
                    PopLinkStack(op,&b);
                    PopLinkStack(optr,&d);
                    switch(d)
                    {
                    case '+':
                        a=b+a;
                        break;
                    case '-':
                        a=b-a;
                        break;
                    case 'x':
                        a=b*a;
                        break;
                    case '/':
                        a=b/a;
                        break;
                    }
                    PushLinkStack(op,a);
                }
                if(priority(getTop(optr),str[i])==0)
                    PopLinkStack(optr,&d);
                else
                    i--;

            }
            else if(p==0)
            {
                PopLinkStack(optr,&d);
            }
        }
    }
    PopLinkStack(op,&a);
    printf("%d",a);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值