經典 計算字串表示的公式的值

2021-07-02 19:24:32 字數 2422 閱讀 2778

題目:

輸入乙個字串,該字串表示乙個公式,公式裡可能有整數、加減乘除符號和左右括號,計算公式的結果。如輸入"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...