題目:
輸入乙個字串,該字串表示乙個公式,公式裡可能有整數、加減乘除符號和左右括號,計算公式的結果。如輸入"48*((70-65)-43)+8*1" ,返回整數-1816.
注意:1、假設公式不會出錯,既不用考慮左右括號不配對、出現非法字元等情況。
2、計算過程或結果不用考慮溢位。
3、輸入的公式中只有整數,沒有小數。整數可能有負數,負數需要用括號括起來,如 「(-3)+4" 。在公式開頭或括號部分的開頭,負數可以沒有括號,如 」-3*4「 和 」(-3*4)「 都是合法的,其他時候負數必須用括號括起來。
方法一:用棧解決問題。 注意
1、乘除號優先順序比加減號高,且跟在減號後面的加減號要變號。
2、要消除多餘的空格,如 「 56」。
3、注意輸入為單獨數字的情況,如 「(56)" 。
int jisuan(char c, int a, int b)
}int calculate(string s)
else
}size = ss.size();
stacknum, num_tmp;
stackfuhao, fuhao_tmp;
s = ss;
int index = 0;
while (index != size)
num.push(sum);
} else//右括號,此時要進行計算
n1 = num.top();
num.pop();
//由於加減號的優先順序低,所以不能計算,先把內容快取
if ((c == '+' || c == '-') && (fuhao.top() == '*' || fuhao.top() == '/'))
else
else
//若條件允許,需要計算快取的內容
if (!num_tmp.empty() && (fuhao.top() == '(' || (fuhao.top() == '+' || fuhao.top() == '-')))
else
fuhao_tmp.pop();
num_tmp.pop();}}
} while (fuhao.top() != '(');
//以下兩行不能忘記!
fuhao.pop();
num.push(n2);
}// 右括號end
} //計算沒有括號的部分
if (!fuhao.empty())
else// 計算
else
if (!num_tmp.empty() && (fuhao.empty() || (fuhao.top() == '+' || fuhao.top() == '-')))
else
fuhao_tmp.pop();
num_tmp.pop();
}}//計算 end
} while (!fuhao.empty());
num.push(n2);
} return num.top();
}
方法二:用雙向陣列deque解決此問題。參考腦客愛刷題
分析:1、先計算乘除法,剩下加減法再統一從左到右計算;
2、遇到左括號,進入遞迴。遇到右括號跳出遞迴;
3、注意**中對輸入字串的數字字元的處理。
//佇列要麼只有乙個值,要麼只有加減法
int jisuan_jiafa_jianfa(deque&deq)
int num = atoi(deq.front().c_str());
deq.pop_front();
while (!deq.empty())
return num;
}void addvaluetodeque(deque&deq, int pre)
//乘除號時,先計算結果,再壓入數字
else if (deq.back() == "*" || deq.back() == "/") }
//返回值第乙個數字是計算結果,第二個數字是接下來要計算的位置,輸入引數index是本函式開始計算的位置
pairgetvalue(const string &str, int index)
//若是加減乘除符號
else if (c != '(')
//若是左括號,進入遞迴
else
}//處理最後乙個數字
addvaluetodeque(deq, pre);
//計算加減號
int result = jisuan_jiafa_jianfa(deq);
return make_pair(result, index + 1);
}int getvalue(const string &str)
字串 表示數值的字串
題目描述 實現乙個函式用來判斷字串是否表示數值 包括整數和小數以及使用科學計數法表示的數 分析 表示數值的字串的規則有 第乙個字元只能是 以及數字 數字字元後面只能接 或 e e 小數點後面必須要有字元且只能接數字字元或 e e e e 後面必須要接字元且只能接數字字元或者 後面必須要接數字字元 b...
表示數值的字串(字串)
題目描述 請實現乙個函式用來判斷字串是否表示數值 包括整數和小數 例如,字串 100 5e2 123 3.1416 和 1e 16 都表示數值。但是 12e 1a3.14 1.2.3 5 和 12e 4.3 都不是。思路 1.第乙個數為 或者為 時,跳過。2.對於小數點 小數點只能出現一次 小數點不...
字串 表示數值的字串
此題出自牛客網的劍指offer專題 請實現乙個函式用來判斷字串是否表示數值 包括整數和小數 例如,字串 100 5e2 123 3.1416 和 1e 16 都表示數值。但是 12e 1a3.14 1.2.3 5 和 12e 4.3 都不是。思路一 直接正規表示式擼起 實現 如下 public cl...