//名字记不太清了,这个叫递归下降算法,但这个算法肯定是首先在编译原理中的,主要用在 //各种编译器中。就是现扫描整个表达式字符串,把其中的运算符找出来,判断它们的优先级 //然后按从左到右的顺序先计算把优先级低的运算符和它两边的数据压入,这样循环做过以后 //再从头取出一个一个计算,表达式的结构类似与二叉树,遍历二叉树后把结果存在连表中供 //计算。你这个程序问题好像比较多啊。用的数据结构类型和函数名根本就不配套 #include <> struct s_node //节点结构体 { int data; struct s_node *next; }; typedef struct s_node s_list; typedef s_list *link; link operator=NULL; link operand=NULL; link push(link stack,int value) //向链表添加数据 { link newnode; newnode=(link) malloc(sizeof(s_list)); if(!newnode) { printf("\nMemory allocation failure!!!"); return NULL; } newnode->data=value; newnode->next=stack; stack=newnode; return stack; } link pop(link stack,int *value) //从链表取出数据 { link top; if(stack !=NULL) { top=stack; stack=stack->next; *value=top->data; free(top); return stack; } else *value=-1; } int empty(link stack) //判断链表是否为空 { if(stack==NULL) return 1; else return 0; } int is_operator(char operator) //判断是否是运算符号 { switch (operator) { case '+': case '-': case '*': case '/': return 1; default:return 0; } } int priority(char operator) //判断运算符优先级 { switch(operator) { case '+': case '-' : return 1; case '*': case '/' : return 2; default: return 0; } } int two_result(int operator,int operand1,int operand2) //计算数值,计算器的核心 { switch(operator) { case '+':return(operand2+operand1); case '-':return(operand2-operand1); case '*':return(operand2*operand1); case '/':return(operand2/operand1); } } void main() { char expression[50]; int position=0; int op=0; int operand1=0; int operand2=0; int evaluate=0; printf("\nPlease input the inorder expression:"); gets(expression); while(expression[position]!='\0'&&expression[position]!='\n') { if(is_operator(expression[position])) { if(!empty(operator)) while(priority(expression[position])<= priority(operator->data)&& !empty(operator)) { operand=pop(operand,&operand1); operand=pop(operand,&operand2); operator=pop(operator,&op); operand=push(operand,two_result(op,operand1,operand2)); } operator=push(operator,expression[position]); } else operand=push(operand,expression[position]-48); position++; } while(!empty(operator)) { operator=pop(operator,&op); operand=pop(operand,&operand1); operand=pop(operand,&operand2); operand=push(operand,two_result(op,operand1,operand2)); } operand=pop(operand,&evaluate); printf("The expression [%s] result is '%d' ",expression,evaluate); getch(); }