for (i = 0; string[i] != '\0' && string[i] != '=';) { //从输入串中取出一个字符作为开始,进行处理,直到表达式结束 if (string[i] >= '0' && string[i] <= '9') { //如果是操作数,将整个操作数提取出来,压入操作数栈 pushNumber(getNumFromString(&string[i], &i)); } else { op.name = string[i]; op.priority = getPriority(string[i]); op.opnum = getOpNum(string[i]); topOp = popOperator(); if (op.name == '(') { //如果是'(',将从栈顶弹出的运算符压回栈内,并将当前运算符则压栈 pushOperator(topOp); pushOperator(op); } else if (op.name == ')') { //如果是')',则进行运算,每次运算结果作为一个操作数压入操作数栈,直到将'('弹出运算符栈 while (topOp.name != '(') { pushNumber(operate(topOp)); topOp = popOperator(); } } else { //如果是普通运算符 if (topOp.name != '#' && op.priority <= topOp.priority) { //如果运算符栈非空,且当前运算符的优先级大于栈顶运算符,则进行一次运算,将结果压入操作数栈 pushNumber(operate(topOp)); } else { //否则将从栈顶弹出的运算符压回 pushOperator(topOp); } //将当前运算符压栈 pushOperator(op); } i++; } } //完成栈内剩余的运算 while ((topOp = popOperator()).name != '#') { pushNumber(operate(topOp)); } //操作数栈中剩下的最后一个数即为结果 printf("%f\n", popNumber()); return 0; }
作者:卞昊穹
|