//计算左右操作数+运算符 (对运算符求值) intoperate(int left, int right, int op) { int result = 0; switch (op) { case'+': result = left + right; break; case'-': result = left - right; break; case'*': result = left * right; break; case'/': result = left / right; break; default: break; } return result; }
status = 2;//状态标记为2 下一个为右操作数 } else//不是第一个运算符,那么就将这个与之前的做优先级比较,如果这个优先级高,那就先算这个 {
//当前运算符高于前一个运算符
//当前input[i]运算符 栈里面的存的第一个运算符 if (isLarger(input[i], *getTop(opt_stack)))//如果当前运算符的优先级高于前一个 { //压进栈 pushStack(opt_stack, input[i]);//操作符入栈 status = 2;//下一个是右操作数 rdata = 0;//将右操作数置空 } else//当前运算符的优先级小于(等于)前一个(栈顶)运算符。则计算前一个运算符的值 { int right = 0; int left = 0; int opt = 0;
do { //拿到操作符 和 前面两个左右操作数 //先取到右边的,在取左边的(倒着拿出来) //运算的时候注意参数传递顺序 popStack(data_stack, right); popStack(data_stack, left); popStack(opt_stack, opt); int result = operate(left, right, opt); pushStack(data_stack, result);//得到一部分的结果压进栈 } while (!isEmpty(opt_stack) && !isLarger(input[i],*getTop(opt_stack)));//自动再往前判断,是否可以对前面的表达式进行运算 //运算符栈不为空 并且当前运算符优先级小于等于栈顶运算符(前面的)那么就能一并进行运算