成績
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 ...