【问题描述】给出一个合法的表达式,请输出它的计算结果。表达式满足以下条件:
① 只有+、-、*、/、^(乘方)运算和括号。
② 所有操作数都是非负数。计算过程中(包括最后结果)可能会出现负数,但不会超过 int 的表示范围。
③ 表达式开头、结尾或表达式内部可能有多余的空格。
设两个栈,一个是操作数栈,用来存放操作数,如 3、4、8 等,另一个是运算符栈,用来存放运算符。
首先,将“(”压进运算符栈的栈底①。然后,依次扫描,按照栈的后进先出原则进行:
① 遇到操作数,进操作数栈;
② 遇到运算符时,则需将此运算符的优先级与栈顶运算符的优先级比较。
若高于栈顶元素则进栈,继续扫描下一符号。否则,将运算符栈的栈顶元素退栈,形成一个操作码 Q,同时操作数栈的栈顶元素两次退栈,形成两个操作数 a、b,让计算机对操作数与操作码完成一次运算操作,即 aQb,并将其运算结果存放在操作数栈中。
注意:在向 calc 函数传入表达式之前,必须在表达式两端加一层小括号!
- #define Pop { pos--; \
- switch (symbol[pos+1]) { \
- case '+': number[pos]+=number[pos+1];break; \
- case '-': number[pos]-=number[pos+1];break; \
- case '*':