/*只能输入运算符和数字*/
#include<conio.h>
#include<stdio.h>
#include<string.h>
double Operation(double operand1,char operator1, double operand2);
int IsOperator(char character);
char JudgePrecede(char symbol1,char symbol2);
double EvaluateExpression(void);
void main()
{
/*提示输入一条表达式,要以'#'结尾,回车后可得出结果,如:9-6#回车即可*/
printf("please input a expression:/n");
printf("/n%lf/n",EvaluateExpression());
getch();
return;
}
double EvaluateExpression(void)
{
double digit;
double a,b;
char theta;
char cInput;
char OPTR[20];
double OPND[20];
int top_optr = -1,top_opnd = -1;
OPTR[0] = '#';
top_optr = 0;
cInput = getchar();
digit = 0.0;//临时变量
while( cInput!='#'|| OPTR[top_optr] != '#' )
{/*如果不是操作符,则用变量temp暂时存储*/
/*略施小计,实现一位以上四则运算*/
if( 0 == IsOperator(cInput))
{ /*正数*/
if((cInput <'0') || (cInput > '9') )
return 0;
digit = digit * 10 + (cInput - '0');
cInput = getchar();
}
else /*如果是操作符*/
{
top_opnd++;
OPND[top_opnd] = digit;
digit = 0.0;//临时变量复位
switch(JudgePrecede(OPTR[top_optr], cInput))
{/*当栈顶操作符优先级小于栈外操作符,则入栈,继续输入*/
case '<':top_optr++;
OPTR[top_optr] = cInput;
cInput = getchar();
break;
/*当括号左右两边相遇,则出栈,继续输入*/
case '=':top_optr--;
cInput = getchar();
break;
/*当栈顶操作符优先级大于栈外操作符,则执行运算*/
case '>':theta = OPTR[top_optr];
top_optr--;
a = OPND[top_opnd];
top_opnd--;
b = OPND[top_opnd];
top_opnd--;
top_opnd++;
OPND[top_opnd] =Operation(a,theta,b);
printf("%lf/n",OPND[top_opnd]);
cInput = getchar();
break;
}/*switch*/
}/*if*/
}/*while*/
return( OPND[top_opnd]);
}/*EvaluateExpression*/
/*4则运算*/
double Operation(double operand1,char operator1, double operand2)
{
switch(operator1)
{
case '+' : return(operand1 + operand2);
case '-' : return(operand1 - operand2);
case '*' : return(operand1 * operand2);
case '/' : return(operand1 / operand2);
}
return 0.0;
}
int IsOperator(char character)
{
if(
'+' == character ||
'-' == character ||
'*' == character ||
'/' == character ||
'(' == character ||
')' == character ||
'#' == character
)
return 1;
else
return 0;
}
/*判断运算符优先级,强呀*/
char JudgePrecede(char symbol1,char symbol2)
{
int row,col;
char result[7][7];
strcpy(result[0],">><<<>>");
strcpy(result[1],">><<<>>");
strcpy(result[2],">>>><>>");
strcpy(result[3],">>>><>>");
strcpy(result[4],"<<<<<= ");
strcpy(result[5],">>>> >>");
strcpy(result[6],"<<<<< =");
switch(symbol1)
{
case '+' : row = 0;
break;
case '-' : row = 1;
break;
case '*' : row = 2;
break;
case '/' : row = 3;
break;
case '(' : row = 4;
break;
case ')' : row = 5;
break;
case '#' : row = 6;
break;
}
switch(symbol2)
{
case '+' : col= 0;
break;
case '-' : col = 1;
break;
case '*' : col = 2;
break;
case '/' : col = 3;
break;
case '(' : col = 4;
break;
case ')' : col = 5;
break;
case '#' : col = 6;
break;
}
return result[row][col];
}