二哥想自己做乙個計算器,但是他需要乙個程式來計算輸入表示式的結果。你能幫助他嗎?
輸入僅一行,給出乙個算數表示式。表示式中包含:小括號,加減乘除,指數運算子,負號,整數,空格。其中負號的優先順序最高(-),其次是指數運算(^),然後是乘除(*/),最後是加減(+-)。
這裡規定除法為整除運算,如 5 / 2 = 2, 8 / -3 = -2 等等,與c++中的整除一致。另外注意指數運算為右結合,即 2^3^2 = 2^9 = 512 而非 2^3^2 = 8^2 = 64 。
輸入的字串長度不超過100。
如果輸入的表示式出現括號不匹配或者除零錯誤,輸出一行「error」(不含引號),否則輸出運算結果。輸入保證不包含任何其它型別的錯誤。
輸入的數,輸出的答案,以及中間結果均保證是不超過 long long 範圍的整數。
5 + (1 + 3) * 6 ^ 1
29
(6 + 2)) * 3
error
30%的測試資料含有負號;
30%的測試資料含有指數運算。
#include #include#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
class
token
};class valuetoken : public
token
virtual
bool isoperator()
explicit valuetoken(long
long
val) : value(val) {}
};class operatortoken : public
token optr;
virtual
bool isoperator()
char
get_char()
}explicit
operatortoken(operatortoken::optype op) : optr(op) {}
bool is_prior(const operatortoken&r)
static
bool prior_table[10][10
];};
bool operatortoken::prior_table[10][10]=,//
bgn ,//
end ,//
add ,//
mns ,//
neg ,//
mul ,//
div ,//
pow ,//
lbk ,//
rbk};
vector
> pre_process(const
string &str)
else
switch
(c)
val = 0
; f = false
; }
}if(f)ret.emplace_back(new
valuetoken(val));
ret.emplace_back(
newoperatortoken(operatortoken::end));
return
ret;
}void print(const vector>v)
else
}}void compute(stack>& optrs, stacklong>&vals)
}int
main()
optrs.push(ptr);}}
if(vals.size()!=1||optrs.size()!=2)throw
exception();
}catch
(exception e)
cout
}
表示式求值
程式的說明見清華大學出版社 資料結構 c語言版 include include define stack init size 40 define stackincrement 20 define ok 1 define false 0 typedef structs stack typedef st...
表示式求值
既然是表示式求值,自然需要在記憶體中儲存計算結果以及中間值。在 用c語言寫直譯器 一 中提過 變數要求是若型別,而 c 語言中的 view plaincopy to clipboardprint?in basic io.h define memery size 26 typedef enum var...
表示式求值
寫了乙個下午,各種糾結,各種問,終於搞明白了。但是自己還是想出來的一點東西的。很爽歪歪的,哈哈。先貼第一次的 include include include include include includeusing namespace std char data 7 7 int sign char ...