原帖及討論: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;//標志是數(shù)字還是符號
};
void main()
{
char c;
struct lianbiao lianhe;
struct lianbiao *next;
printf(“請輸入一個計算機能識別的四則運算表達式,如:a+b*(c+d)/en”);
while(1)
{
first:
next=&lianhe;
while((int)(c=getchar())!=10)
{
loop:
//將表達式放入復(fù)合鏈表中
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(“不是合法的算術(shù)表達式!!!n請重新輸入:n”);
while(getchar()!=’n’);//設(shè)置重新輸入
goto first;
}
}
//將鏈表中的數(shù)字和符號分別入棧
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)//對運算復(fù)符的理
{
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; //對數(shù)字的理
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(“%lfn”,arrd[0]);
}
}
}