c语言:栈的练习–后缀式求值
#include <stdio.h>
#define MAXSIZE 100
typedef struct Stack{
double value[ MAXSIZE] ;
int top;
} Stack;
void Init_Stack ( Stack * S) ;
void Push_data ( Stack * S, double d) ;
double if_data ( Stack * S, char input[ ] ) ;
double Calculate ( Stack * S, double left, double right, char c) ;
int main ( )
{
Stack S;
double result;
char input[ 100 ] ;
while ( 1 )
{
char flag = 0 ;
Init_Stack ( & S) ;
printf ( "请输入后缀式:\n" ) ;
gets ( input) ;
result = if_data ( & S, input) ;
printf ( "=%.2lf\n" , result) ;
printf ( "是否继续输入'y'or''n:" ) ;
e: scanf ( "%c" , & flag) ;
fflush ( stdin ) ;
if ( flag == 'n' || flag == 'y' )
{
if ( flag == 'n' )
{
printf ( "运行结束!\n" ) ;
break ;
}
}
else
{
printf ( "输入有误,请输入'y'or'n':" ) ;
goto e;
}
fflush ( stdin ) ;
}
return 0 ;
}
void Init_Stack ( Stack * S)
{
S-> top = - 1 ;
}
void Push_data ( Stack * S, double d)
{
S-> top++ ;
S-> value[ S-> top] = d;
}
double Calculate ( Stack * S, double left, double right, char c)
{
double equal = 0 ;
switch ( c)
{
case '+' :
equal = left + right;
break ;
case '-' :
equal = left - right;
break ;
case '*' :
equal = left * right;
break ;
case '/' :
equal = left / right;
break ;
default :
break ;
}
S-> top-- ;
S-> value[ S-> top] = equal;
return equal;
}
double if_data ( Stack * S, char input[ ] )
{
int i = 0 ;
double n = 0 ;
double temp = 0 ;
for ( i= 0 ; input[ i] != '\0' ; i++ )
{
if ( input[ i] <= '9' && input[ i] >= '0' )
{
temp = input[ i] - '0' ;
while ( input[ i+ 1 ] != '\0' )
{
if ( input[ i+ 1 ] <= '9' && input[ i+ 1 ] >= '0' )
{
temp = temp* 10 + ( input[ i+ 1 ] - '0' ) ;
i++ ;
}
else
break ;
}
Push_data ( S, temp) ;
}
else if ( input[ i] == '+' || input[ i] == '-' || input[ i] == '*' || input[ i] == '/' )
{
n= Calculate ( S, S-> value[ S-> top- 1 ] , S-> value[ S-> top] , input[ i] ) ;
}
}
return n;
}