不知道当初为什么写这段代码,不过记得当时写出来费不少劲呢,呵呵,现在看看,原来没判断右括号是否少的情况,只判断了是否多,不过应该不影响使用,当然了,完全用浮点数来算的,也别指望计算的精确性了
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define ISOP(c) ( c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')' ? true : false )
typedef struct point{
char c;
double n;
struct point * p;
} PO;
static int op ( char c );
static PO * creat(int kh_fla);
static double todo(PO *p);
static void PR(PO * p)
{
while ( p != NULL ) {
if ( p -> c == '\0' ) printf ( "%lf " , p -> n );
else printf ( "%c " , p -> c );
p = p -> p;
}
}
int main(int argc, char** argv)
{
PO *p;
printf ( "输入你要计算的表达式吧,拜托别输入错误哦,程序没做错误检测的:\n" );
if ( ( p = creat(0) ) != NULL ) {
PR(p);
printf ( "结果是:%lf\t是否正确呢?" , todo( p ) );
}
printf ( "\n" );
return 0;
}
static int op ( char c )
{
if ( c == '+' || c == '-' ) return 1;
if ( c == '*' || c == '/' ) return 2;
return 0;
}
static void ql(PO *p)
{
PO *p_tmp;
while ( p != NULL ) {
p_tmp = p;
p = p -> p;
free(p_tmp);
}
}
static PO * creat(int kh_fla)
{
PO * p_op = NULL;
PO * p_bds = NULL;
PO * p_tmp = NULL;
PO * p_tmp_to = NULL;
char c = '\0';
double n;
do {
if ( scanf ( "%lf" , &n ) == 1 ) {
p_tmp = ( PO * ) ( malloc ( sizeof ( PO ) ) );
p_tmp -> c = '\0';
p_tmp -> n = n;
p_tmp -> p = p_bds;
p_bds = p_tmp;
}
me: if ( scanf ( "%c" , &c ) == 1 ) {
switch ( c ) {
case '(' : {
p_tmp_to = p_tmp = creat ( kh_fla+1 );
if ( p_tmp_to == NULL ) return NULL;
while ( p_tmp -> p != NULL ) p_tmp = p_tmp -> p;
p_tmp -> p = p_bds;
p_bds = p_tmp_to;
goto me;
}
case ')' : {
if ( kh_fla == 0 ) {
printf ( "括号不匹配,程序异常退出" );
ql(p_op);
ql(p_bds);
ql(p_tmp);
return NULL;
} else {
while ( p_op != NULL ) {
p_tmp = p_op;
p_op = p_op -> p;
p_tmp ->p = p_bds;
p_bds = p_tmp;
}
return p_bds;
}
}
case '+' :
case '-' :
case '*' :
case '/' : {
if ( p_op != NULL && op ( p_op -> c ) >= op ( c ) ){
p_tmp = p_op;
p_op = p_op->p;
p_tmp->p = p_bds;
p_bds = p_tmp;
}
p_tmp = ( PO * ) ( malloc ( sizeof ( PO ) ) );
p_tmp -> c = c;
p_tmp -> n = 0.0;
p_tmp -> p = p_op;
p_op = p_tmp;
}
}
} else {
printf ( "程序出错了,异常退出" );
ql(p_op);
ql(p_bds);
ql(p_tmp);
return NULL;
}
} while (ISOP(c));
while ( p_bds != NULL ) {
p_tmp = p_bds;
p_bds = p_bds->p;
p_tmp->p = p_op;
p_op = p_tmp;
}
return p_op;
}
static double js( double a , char op , double b )
{
switch ( op ) {
case '+' : return a+b;
case '-' : return a-b;
case '*' : return a*b;
case '/' : return a/b;
}
return 0.0;
}
static double todo(PO *p)
{
PO * p_bds = NULL;
PO * p_tmp;
while ( p != NULL ) {
if ( p -> c == '\0' ) {
p_tmp = p;
p = p -> p;
p_tmp -> p = p_bds;
p_bds = p_tmp;
} else {
if ( p_bds != NULL && p_bds->p != NULL ) {
(p_bds -> p) -> n = js ( (p_bds -> p) -> n , p -> c , p_bds -> n );
p_tmp = p_bds;
p_bds = p_bds -> p;
free(p_tmp);
} else {
if ( p_bds != NULL ) {
p_bds -> n = js ( 0.0 , p -> c , p_bds -> n );
}
}
p_tmp = p;
p = p -> p;
free(p_tmp);
}
}
return p_bds == NULL ? 0 : p_bds->n;
}