1033 表示式求值

2022-04-17 21:21:20 字數 2190 閱讀 9323

二哥想自己做乙個計算器,但是他需要乙個程式來計算輸入表示式的結果。你能幫助他嗎?

輸入僅一行,給出乙個算數表示式。表示式中包含:小括號,加減乘除,指數運算子,負號,整數,空格。其中負號的優先順序最高(-),其次是指數運算(^),然後是乘除(*/),最後是加減(+-)。

這裡規定除法為整除運算,如 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 ...