题目:
问题描述
输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
输入一行,包含一个表达式。
输出格式
输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
表达式长度不超过100,表达式运算合法且运算过程都在int内进行。
上代码:
1 #include<stack> 2 #include<iostream> 3 #include<string> 4 using namespace std; 5 int mat[5][6] = {//+,-,*,/,( 6 1, 1, 0, 0, 0, 1, 7 1, 1, 0, 0, 0, 1, 8 1, 1, 1, 1, 0, 1, 9 1, 1, 1, 1, 0, 1, 10 0, 0, 0, 0, 0, 1 11 }; 12 string str; 13 stack<int> nu; 14 stack<int> op; 15 int len; 16 void get(bool &flag, int &retn, int &i){//返回字符串的第i个数据 17 char tmp; 18 tmp = str.at(i); 19 if (tmp <= ‘9‘&&tmp >= ‘0‘){//是数字 20 int x = 0; 21 while (i<len&&str.at(i) <= ‘9‘&&str.at(i) >= ‘0‘){ 22 x = x * 10 + str.at(i) - 48; 23 i++; 24 } 25 i--; 26 flag = false; 27 retn = x; 28 } 29 else{//是运算符 30 flag = true; 31 if (tmp == ‘+‘) retn = 0; 32 else if (tmp == ‘-‘) retn = 1; 33 else if (tmp == ‘*‘) retn = 2; 34 else if (tmp == ‘/‘) retn = 3; 35 else if (tmp == ‘(‘) retn = 4; 36 else retn = 5; 37 } 38 } 39 int main(){ 40 cin >> str; 41 len = str.size(); 42 int idx = 0; 43 bool isstring; 44 int retnum; 45 while (idx<len){ 46 get(isstring, retnum, idx); 47 if (isstring == false){//是数字 48 nu.push(retnum); 49 } 50 else{//是操作符 51 if (op.empty() || mat[op.top()][retnum] == 0){//符号入栈 52 op.push(retnum); 53 } 54 else{//需要进行出栈 55 while (!op.empty() && mat[op.top()][retnum] == 1){//如果符号栈非空并且 需要进行出栈操作 56 int tmp = op.top();//栈顶符号 57 op.pop(); 58 if (tmp == 4) break;//如果栈顶是左括号,直接左括号出栈。 59 //如果栈顶不是左括号,取出数字栈的最上面两个 和运算符运算。 60 int a = nu.top(); 61 nu.pop(); 62 int b = nu.top(); 63 nu.pop(); 64 if (tmp == 0) nu.push(a + b); 65 else if (tmp == 1) nu.push(b-a); 66 else if (tmp == 2) nu.push(a*b); 67 else if (tmp == 3) nu.push(b / a); 68 } 69 if (retnum != 5) op.push(retnum); 70 } 71 } 72 idx++; 73 } 74 while (!op.empty()){//最后依次取出符号栈来进行运算 75 int tmp = op.top();//栈顶符号 76 op.pop(); 77 int a = nu.top(); 78 nu.pop(); 79 int b = nu.top(); 80 nu.pop(); 81 if (tmp == 0) nu.push(a + b); 82 else if (tmp == 1) nu.push(b-a); 83 else if (tmp == 2) nu.push(a*b); 84 else if (tmp == 3) nu.push(b/a); 85 } 86 cout << nu.top() << endl; 87 }
时间: 2024-10-20 15:52:32