仿LISP运算 | c++

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 /**
 4  *  仿LISP运算
 5  *  模拟(sub (mul 2 4) (div 9 3))
 6  * @return
 7  */
 8 
 9 int main() {
10     int mark = 0;
11     int num1,num2;
12     string str;
13     stack<int> numStatck;
14     stack<string> operStack;
15 
16     getline(cin,str);
17     for(int i = 0; i < str.length() ; i++)
18     {
19         char c = str[i];
20         cout<<c<<" ";
21         if(c == '(') {
22             operStack.push(str.substr(i+1,3));
23             i += 4;
24             mark =  i + 1;
25         } else if(c == ')') {
26             if(mark < i) {
27                 //stoi string --> int
28                 numStatck.push(stoi(str.substr(mark,i-mark)));
29 
30                 i++;
31                 mark = i + 1;
32             }
33             num1 = numStatck.top();
34             numStatck.pop();
35             num2 = numStatck.top();
36             numStatck.pop();
37             string ex = operStack.top();
38             operStack.pop();
39 
40             if(ex == "add")
41                 numStatck.push(num1+num2);
42             else if(ex == "sub")
43                 numStatck.push(num1-num2);
44             else if (ex == "mul")
45                 numStatck.push(num1*num2);
46             else if( ex ==  "div")
47                 if(num2 == 0) cout <<"ERROR"<<endl;
48                 else
49                     numStatck.push(num2/num1);
50 
51         } else {
52             if(c == ' ') {
53                 if(mark < i ) {
54                     numStatck.push(stoi(str.substr(mark,i-mark)));
55                     mark = i + 1;
56                 }
57             }
58         }
59     }
60     cout<<"结果:";
61     cout<<numStatck.top()<<endl;
62     return 0;
63 }

 

posted @ 2019-07-14 15:14  听说这是最长的名字了  阅读(656)  评论(1编辑  收藏  举报