簡單的表達式計算 c++
阿新 • • 發佈:2018-05-10
exp 彈出 表示 tchar res space ID pac 簡單
1 #include<iostream> 2 #include<stack> 3 #include<string> 4 #include<vector> 5 #include<map> 6 #include<algorithm> 7 using namespace std; 8 9 map<const char, int> priority;//用map來儲存運算符的優先級 10 11 int compare(char a, char b){ 12 int cmp = 0; 13 if(b==‘)‘ && a==‘(‘) cmp = 0; 14 else if(a==‘(‘) cmp = -1; 15 else if(priority[a] < priority[b]) cmp = -1; 16 else if(priority[a] >= priority[b]) cmp = 1; 17 return cmp; 18 } 19 20 int cal(int a, int b, char op){ 21 int ans; 22 if(op==‘+‘) ans = a+b; 23 else if(op==‘-‘) ans = a-b; 24 else if(op==‘*‘) ans = a*b; 25 else if(op==‘/‘) ans = a/b; 26 return ans; 27 } 28 29 int calculator(){ 30 //根據優先級的關系,可以把他們的優先級定義為下面的形式 31 //個別運算符的優先級是與位置前後有關系的,需要特俗處理 32 priority[‘#‘] = -1; 33 priority[‘)‘] = 0; 34 priority[‘+‘] = 1; 35 priority[‘-‘] = 1; 36 priority[‘*‘] = 2; 37 priority[‘/‘] = 2; 38 priority[‘(‘] = 3; 39 cout<<"please input valid expression, enter to terminate..."<<endl; 40 char ch = getchar(); 41 stack<char> op; 42 stack<int> nums; 43 op.push(‘#‘); 44 nums.push(0); 45 bool flag = true; 46 while(ch!=‘#‘ || op.top()!=‘#‘){ 47 if(ch<=‘9‘ && ch>=‘0‘){ 48 int number = 0; 49 while(ch>=‘0‘ && ch<=‘9‘){//連續出現的數字看做一個整體 50 number = number*10 + (ch-‘0‘); 51 ch = getchar(); 52 } 53 // cout<<"number: "<<number<<endl; 54 // cout<<"op: "<<ch<<endl; 55 nums.push(number); 56 flag = true; 57 }else{//比較棧頂運算符和新輸出運算符的優先級 58 int cmp = compare(op.top(), ch); 59 //cout<<"compare("<<op.top()<<","<<ch<<") = "<<cmp<<endl; 60 if(cmp==-1){//頂部優先級低時,把新的運算符壓棧 61 op.push(ch); 62 flag = false; 63 ch = getchar(); 64 }else if(cmp==0){//即棧頂和新的運算符是‘(‘和‘)‘,需要把‘(‘彈出 65 op.pop(); 66 ch = getchar(); 67 }else if(cmp==1){//棧頂運算符優先級高的時候,就要進行運算 68 int num1, num2, tempans; 69 char tempop;//一定要註意num的順序,否則會導致錯誤的運算結果 70 num2 = nums.top(); 71 nums.pop(); 72 num1 = nums.top(); 73 nums.pop(); 74 tempop = op.top(); 75 op.pop(); 76 tempans = cal(num1, num2, tempop); 77 //cout<<"tempans: "<<tempans<<endl; 78 nums.push(tempans); 79 } 80 if(ch==‘-‘ && !flag) nums.push(0); 81 82 } 83 } 84 cin.get(); 85 return nums.top(); 86 } 87 int main(){ 88 int i = 10; 89 while(i--){ 90 cout<<calculator()<<endl; 91 } 92 return 0;}
這個程序沒有檢錯功能
輸入只能包含0-9,+,-,*,/,(,),#;
#只能出現在表達式尾部表示輸入結束
保證你的表達式語法正確
下面是一些例子
簡單的表達式計算 c++