用到的是算符优先法的思想,现摘自严蔚敏的数据结构(C 语言版)的3.2.5 章来详细说明算符优先法的思想: (摘抄结束) 我给出的计算器功能有:支持欧拉数e,支持圆周率pi,支持运算符=,-,*,/,求幂符号^,阶乘!,正弦sin,余弦cos,正切tan,以10 为底的对数函数lg,以欧拉数为底的对数函数ln,优先级表为:(!表示不合法) #inclu de #inclu de #inclu de #inclu de #inclu de //引用请注明出处: http://hi.baidu.com/liangxiaowen1989/blog/item/af972310f7119670ca80c413.html #define MAX_TOKEN_LEN 100 //标记最大长度 #define EXPR_INCREMENT 20//表达式长度的增量 typedef struct { double opnd; //操作数 char optr[11]; //运算符 int flag; //若为1,则为单目运算符,2 则是双目运算符 } SElemType; //栈元素类型 typedef struct SNode { //栈 SElemType date; struct SNode * next; } SNode, *Stack; struct { //用来存储一个操作数或运算符 char str[MAX_TOKEN_LEN]; int type; //类型,若为0,则为操作数,若为1 则为运算符 } token; struct { //expression,用来存储表达式 char *str; int cur; //标记读取 expr 的当前位置 }expr; Stack OPND, OPTR; //操作数栈operand,运算符栈operator int expr_size; //表达式长度 void InitStack(Stack *S) { //初始化栈 *S = (Stack)malloc(sizeof(SNode)); if(!(*S)) { printf("动态申请内存失败!\n"); exit(0); } //if (*S)->next = NULL; } //InitStack void DestroyStack(Stack *S) { //销毁栈 SNode *p; while(p = *S) { *S = p->next; free(p); } //while } //DestroyStack void Push(Stack S, SElemType e) { //入栈 SNode *p; p = (SNode *)malloc(sizeof(SNode)); if(! p) { printf("动态申请内存失败!\n"); exit(0); } //if strcpy(p->date.optr,e.optr); p->date.opnd = e.opnd; p->date.flag = e.flag; p->next = S->next; S->next = p; } //Push void Pop(Stack S,SElemType *e) { //出栈 SNode *p; p = S->next; if(! p) { printf("栈为空,不能出栈!\n"); exit(0); } //if S->next = p->next; strcpy(e->optr,p->date.optr)...