表示式求值

2021-08-14 11:00:21 字數 3648 閱讀 7410

成績

15開啟時間

2023年10月18日 星期三 14:00

折扣0.8

折扣時間

2023年11月8日 星期三 23:55

允許遲交

否關閉時間

2023年01月8日 星期一 23:55

我們的教材中已經介紹了表示式求值的演算法,現在我們將該演算法的功能進行擴充套件,要求可以處理的運算子包括:+、-、*、/、%(整數取餘)、^(乘方)、(、)。

採用算符優先演算法,計算的中間結果只保留整數。

第一行為整數n。表示下面有n個表示式

從第二行起的後面n行為n個由整數構成的表示式

共n行,每行為相應表示式的計算結果。

如果判斷出表示式有錯誤,則輸出:error.

如果在計算過程中出現除數為0的情況,則輸出:divide 0.

特殊情況說明:

在表示式中,如果運算元出現負數(例如-8),則要特別注意。例如:

10加-8表示為:10+-8。

10減-8表示為:10--8。

測試輸入

期待的輸出

時間限制

記憶體限制

額外程序

測試用例 1

以文字方式顯示

4↵2^3↵

2^0↵

2^3^2↵

2^(3-1)^(10-8)↵

以文字方式顯示

8↵1↵

512↵

16↵

1秒64m

0測試用例 2

以文字方式顯示

11↵(2+8↵

2+8)↵

8/0↵

8/(8+5-13)↵

2^(2-5)↵

10-(80-30(/3*3+4↵

10-80-30)/3*3+4↵

(2+8)(3+2)↵

(2)3(8)↵

30(/3+3)+4↵

10(20-8)+2↵

以文字方式顯示

error.↵

error.↵

divide 0.↵

divide 0.↵

error.↵

error.↵

error.↵

error.↵

error.↵

error.↵

error.↵ 1秒

64m0

測試用例 3

以文字方式顯示

2↵10(10)↵

14*10-(10)2↵

以文字方式顯示

error.↵

error.↵ 1秒

64m0

測試用例 5

以文字方式顯示

14↵18-32↵

18/4↵

18%3↵

10+20*4↵

10-20/4↵

(18-3)*3↵

10*(10)↵

(10+2)/(8-10)↵

(2*3)/(5*2)↵

10-(80-30)/3*3+4↵

(((2+8)*2-(2+4)/2)*2-8)*2↵

(((8+2)*(4/2)))↵

10/0↵

(10-80*2↵

以文字方式顯示

-14↵

4↵0↵

90↵5↵

45↵100↵

-6↵0↵

-34↵

52↵20↵

divide 0.↵

error.↵ 1秒

64m0

#include#include#include#include#include#includeusing namespace std; 

mapvarible;

stackop;

stackopnum;

string instruction;

string tmp;

int flag;

int getproiincoming(char c) }

int getproinstack(char c) }

int comput(char c, int a, int b) }

int getvar(string tmp)

num = num * 10 + tmp[i] - '0';

} else if (!(tmp[i] >= '0'&&tmp[i] <= '9'))

if (i>0&&(tmp[i - 1] >= '0'&&tmp[i - 1] <= '9'))

else if (i == 0 && (tmp[i] == '+' || tmp[i] == '-') && (tmp[i+1] >= '0'&&tmp[i+1] <= '9'))

if (tmp[i - 1] == '-') num *= -1; i = k - 1; continue;

} else if (i == 0 && (tmp[i] == '%' || tmp[i] == '*' || tmp[i] == '/' || tmp[i] == '^'))

else if (i>0 && !(tmp[i - 1] >= '0'&&tmp[i - 1] <= '9') && (tmp[i] == '+' || tmp[i] == '-') && (tmp[i + 1] >= '0'&&tmp[i + 1] <= '9'))

if (tmp[i - 1] == '-') num *= -1; i = k - 1; continue;

} if (op.empty() || tmp[i] == '(')

} op.push(tmp[i]);

if (tmp[i] == '(') numleft++;

continue;

} else if (tmp[i] == ')')

char op;

while (!op.empty() && (op = op.top()) != '(')

else if (b < 0 && op == '^')

else

op.pop();

} op.pop();

} else

else if (b < 0 && op == '^')

else

op.pop();

} op.push(tmp[i]);

} }

} if (tmp[tmp.length() - 1] >= '0'&&tmp[tmp.length() - 1] <= '9')

opnum.push(num);

if (!op.empty() || !opnum.empty())

int b = opnum.top(); opnum.pop();

int a = opnum.top(); opnum.pop();

if (b == 0 && op == '/')

else if (b < 0 && op == '^')

else

op.pop();

} return opnum.top();

} else return num; }

int main()

else

} return 0;

}

表示式求值

程式的說明見清華大學出版社 資料結構 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 ...