问题描述
输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
输入一行,包含一个表达式。
输出格式
输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
表达式长度不超过100,表达式运算合法且运算过程都在int内进行。
思路分析:
我们一般的表达式计算都是中缀表达式,而计算机中习惯用后缀表达式计算,所以,我们需要转换成后缀表达式,借用栈来完成计算。
要注意计算优先级的问题,若即将要入栈的是* /
运算符,要考虑栈顶是否是* /
,如果是,可以计算栈中已有的元素,否则,暂时不计算。说出来有点抽象,举个栗子吧。如果我们要计算4+3*2
,那么当乘号*
入栈的时候,不能计算4*3
,因为现在符号栈顶是比乘除优先级低的+
号。
而如果是4*3*2
,栈顶元素是*
,现在就可以计算4*3
了。应该解释清楚了吧(。-ω-)zzz
AC代码:
#include <iostream>
#include <cstring>
#include <stack>
#include <cstdlib>//atoi函数头文件
using namespace std;
stack<char> fu;//符号栈
stack<int> num;//数值栈
void js(char c){
int n1,n2;
if(c=='+' || c=='-' || c==')'){
while(fu.top()!='('){