#include<iostream>
#include<bits/stdc++.h>
using namespace std;
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
int solve(string s) {
// write code here
stack<int> stackNum;
stack<char> stackCh;
int flag = 0;//用来判断字符串中是否有连续数字 比如 12+2
for(int i = 0;i < s.length();i++){
char c = s[i];
if(c >= '0' && c <= '9'){
if(flag == 0)
stackNum.push(int(c - '0'));
if(flag == 1){
int z = stackNum.top() * 10;
z = z + int(c - '0');
stackNum.pop();
stackNum.push(z);
}
flag = 1;
}else{
flag = 0;
if(!stackCh.empty()){
char topCh = stackCh.top();
if(c == ')'){
//必须把所有括号中间的进行运算
while(topCh != '('){
int b = stackNum.top();
stackNum.pop();
int a = stackNum.top();
stackNum.pop();
stackCh.pop();
int z = doIt(a,b,topCh);
stackNum.push(z);
topCh = stackCh.top();
}
stackCh.pop();
continue;
}
if(c == '('){
stackCh.push(c);
continue;
}
//直接循环把前面所有优先级的计算,最特殊的就是遇到 )
while(topCh != '(' && !stackCh.empty() && compareF(topCh,c) == 1){
int b = stackNum.top();
stackNum.pop();
int a = stackNum.top();
stackNum.pop();
stackCh.pop();
int z = doIt(a,b,topCh);
stackNum.push(z);
//第一个优先级高的话会出问题
if(!stackCh.empty())
topCh = stackCh.top();
}
stackCh.push(c);
}else{
stackCh.push(c);
}
}
}
int b = stackNum.top();
stackNum.pop();
int a = stackNum.top();
char topCh = stackCh.top();
int z = doIt(a,b,topCh);
return z;
}
int doIt(int a,int b,char c){
int result = 0;
switch(c){
case '+':{
result = a + b;
break;
}
case '-':{
result = a - b;
break;
}
case '*':{
result = a * b;
break;
}
case '/':{
result = a / b;
break;
}
}
return result;
}
int compareF(char a,char b){
int left,right;
switch(a){
case '+':{
left = 1;
break;
}
case '-':{
left = 1;
break;
}
case '*':{
left = 2;
break;
}
case '/':{
left = 2;
break;
}
}
switch(b){
case '+':{
right = 1;
break;
}
case '-':{
right = 1;
break;
}
case '*':{
right = 2;
break;
}
case '/':{
right = 2;
break;
}
}
if(left>=right) return 1;
else return -1;
}
};
int main(){
Solution so;
string s1 = "1+2";
string s2 = "(2*(3-4))*5";
string s3 = "3+2*3*4-1";
cout<<" " <<so.solve(s1)<<endl;
return 0;
}