站内搜索

用复合链表和栈外理四则运算

原帖及讨论:http://bbs.bccn.net/thread-151098-1-1.html

#include<stdio.h>
#include<malloc.h>
union nuionnum
{
    double num1;
    char num2;
};
struct lianbiao
{
    struct lianbiao *p;
    union nuionnum num;
    int flage;//标志是数字还是符号

};
void main()
{    
    char c;
    struct lianbiao lianhe;
    struct lianbiao *next;
    printf("请输入一个计算机能识别的四则运算表达式,如:a+b*(c+d)/e/n");
    while(1)
    {
first:
        next=&lianhe;
        while((int)(c=getchar())!=10)
        {    
loop:
        //将表达式放入复合链表中
            if (c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')')
            {
                next->num.num2=c;
                if (c== '+' || c== '-' )
                    next->flage =1;
                else if(c== '*' ||c== '/' )
                    next->flage =2;
                else if(c== '(' )
                    next->flage =3;
                else if(c== ')' )
                    next->flage =4;
                next->p=calloc(1,sizeof(struct lianbiao));
                next=next->p;
                next->p=NULL;
            }
            else if(c>='0'&&c<='9')
            {  long int t=1;
               int flag=0;
                next->num.num1=c-48;
                while(((c=getchar())>='0'&&c<='9')||c=='.')
                {    
                    if (flag==1 && c!='.')
                            {
                                t=t*10;
                                next->num.num1=next->num.num1+(c-48.0)/t;
                            }
                    else if(c>='0'&&c<='9')
                        next->num.num1=next->num.num1*10+c-48;

                    if (c=='.')
                    {
                        flag=1;
                    }
                }
                next->flage =0;
                next->p=calloc(1,sizeof(struct lianbiao));
                next=next->p;
                next->p=NULL;
                if (c=='/n')break;
                goto loop;
            }
            else
            {
                printf("不是合法的算术表达式!!!/n请重新输入:/n");
                while(getchar()!='/n');//设置重新输入
                goto first;
            }
        }
//将链表中的数字和符号分别入栈
    next=&lianhe;
    {
        int i=0,j=0;//用来标记栈的顶点
        double arrd[100];
        char arrc[2][100];
        while(next->p!=NULL)
        {
            if (next->flage !=0&&next->num.num2==')')//括号的外理
            {
                while(arrc[0][i-1]!='(')//出栈
                {
                    if (arrc[0][i-1]=='+')
                    {
                        arrd[j-2]=arrd[j-2]+arrd[j-1];
                        i=i-1;
                        j=j-1;
                    }
                    else if(arrc[0][i-1]=='-')
                    {
                        arrd[j-2]=arrd[j-2]-arrd[j-1];
                        i=i-1;
                        j=j-1;
                    }
                    else if(arrc[0][i-1]=='*')
                    {
                        arrd[j-2]=arrd[j-2]*arrd[j-1];
                        i=i-1;
                        j=j-1;
                    }
                    else if(arrc[0][i-1]=='/')
                    {
                        arrd[j-2]=arrd[j-2]/arrd[j-1];
                        i=i-1;
                        j=j-1;
                    }
                }
                i=i-1;
            }
            else if (next->num.num2 =='(')//入栈
            {
                arrc[1][i]=next->flage;
                arrc[0][i]=next->num.num2;
                i++;
            }
            else if (next->flage !=0)//对运算复符的理
            {
front:
                if (i>0&&next->flage<arrc[1][i-1]&&arrc[1][i-1]!=3)
                {
                    if (arrc[0][i-1]=='*')
                    {
                        arrd[j-2]=arrd[j-2]*arrd[j-1];
                        i=i-1;
                        j=j-1;
                    }
                    else if(arrc[0][i-1]=='/')
                    {
                        arrd[j-2]=arrd[j-2]/arrd[j-1];
                        i=i-1;
                        j=j-1;    
                    }
                    goto front;
                }
                arrc[1][i]=next->flage;
                arrc[0][i]=next->num.num2;
                i++;
            }
            else
            {
                arrd[j]=next->num.num1; //对数字的理
                j++;
            }
            next=next->p;
        }
        while(i!=0)//全部入栈之后对椎的外理
        {
                if (arrc[0][i-1]=='+')
                    {
                        arrd[j-2]=arrd[j-2]+arrd[j-1];
                        i=i-1;
                        j=j-1;
                    }
                else if (arrc[0][i-1]=='-')
                    {
                        arrd[j-2]=arrd[j-2]-arrd[j-1];
                        i=i-1;
                        j=j-1;
                    }
                else if (arrc[0][i-1]=='*')
                    {
                        arrd[j-2]=arrd[j-2]*arrd[j-1];
                        i=i-1;
                        j=j-1;
                    }
                    else if(arrc[0][i-1]=='/')
                    {
                        arrd[j-2]=arrd[j-2]/arrd[j-1];//1+2*3/4+5   1 1.5 5   ++
                        i=i-1;
                        j=j-1;    
                    }
        }
        printf("%lf/n",arrd[0]);

    }
    }
}

 

  • 上一篇:教你如何放大显示ASCII字符(文本模式)
  • 下一篇:TC2.0开发的图形编辑处理软件Cool Painter