“反向波兰表达式”(Reverse Polish Notation )也称为后缀表达式。 这是一个非常复杂的表达式,可以将非常复杂的表达式转换为可以通过简单的操作获得结果的表达式。 以下c语言用于将骑马订表达式转换为后缀表达式并计算结果: 与网上现有程序相比,该程序的最大优点是: 1、支持浮点运算; 2、支持用符号和单词表示数值; 3、支持参与运算的有多位;
骑马订转换后缀规则:
1、依次读入骑马订形式,遇到操作数(即表示数字或数字的字母组合)时,直接作为后缀形式的一部分输出;
2、被操作员读入时放入堆栈,遇到左括号时放入堆栈;
3、上述操作员在进入堆栈前,必须将当前进入堆栈的操作员与堆栈中现有操作员的优先级进行比较。 如果堆栈中现有操作符的优先级高于当前进入堆栈的操作符,则依次弹出堆栈中的操作符,并将弹出的内容作为后缀表达式的一部分输出。 直到堆栈中操作员的优先级低于当前需要进入堆栈的操作员;
4、读取方括号时,取出前面堆栈的元素,将取出的运算符作为后缀表达式的一部分输出。 直到遇到花括号
5、弹上述堆栈时,遇到左括号,只是弹出,弹出的内容不是后缀表达的一部分
6、骑马订格式加载结束后,依次弹出堆栈内操作符,并将其作为后缀格式的一部分输出;
/* * * * * * * * * *
* author : Wayne王
*修改: aug 22 2018
*
*
*/
# include # include # include # include
#define MAX_LEN 256
#define ELEMENT_TYPE_VALUE 0
#define ELEMENT_TYPE_OP 1
#define STACK_END_FLAG '# '
typedef union rpn_element{
浮点值;
char op;
}rpn_element_u;
类型定义结构{
rpn_element_u value;
Int类型;
}rpn_element_t;
typedef struct __rpnList__{
rpn_element_u value;
Int类型;
struct __rpnList__ *next;
}rpn_element_list_t;
类型定义结构{
char *name;
浮点值;
}rpn_var_t;
类型定义结构{
char *data;
int len;
}rpn_str_t;
typedef struct __stack__{
rpn_element_u value;
Int类型;
struct __stack__ *next;
}rpn_stack_t;
rpn_var_t vars[]={{'one ',1.2},{'two ',2.3},{'three ',3.4},{'four ',4.5},{'five ',4.
voidrpn_init(rpn_stack_t**s );
void rpn _ free _ list (rpn _ element _ list _ t * node );
voidrpn_push(rpn_stack_t**s,rpn_element_t *e );
voidrpn_pop(rpn_stack_t**s,rpn_element_t **e );
intrpn_geToplevel(charop;
void rpn _ print _ list (rpn _ element _ list _ t * node );
int build _ rpn _ exprss (char * express,rpn_element_list_t **list );
int rpn _ CAC _ express (rpn _ element _ list _ t * node,float *ret );
输入主(语音) {
rpn_element_list_t *list;
浮点值;
char *express='(one five ) ((four-two )2) *three= ';
if(build_rpn_exprss(express,list )==0) )
rpn _ print _ list (列表;
}
else{
打印机(buildrpnerror );
}
rpn_CAC_express(list,value );
printf(answer:%f )、value );
返回0;
}