1 #include <iostream> 2 #include<sstream> 3 using namespace std; 4 template<typename T> 5 class stack 6 { 7 T p[40]; 8 int toop; 9 public: 10 stack() { toop = -1; } 11 void push(T t) { toop++; p[toop] = t; } 12 T top() { return p[toop]; } 13 bool empty() { if (toop == -1)return true; return false; } 14 void pop() { toop--; } 15 }; 16 class caculator 17 { 18 string s;//原波兰式的容器 19 stack<char>op; 20 stack<float>num; 21 stringstream ss;//用于转换的流 22 stringstream sb;//插入逆波兰式的流 23 string str;//存放数字的容器,每次更新 24 string strs;//存放逆波兰式的容器 25 float x, y; 26 public: 27 caculator(char *p) { s = p; } 28 float trans(const char *p); 29 float antipoland(); 30 void show() { cout << strs; } 31 void readnum(); 32 void caucEveTime(); 33 void shownum() { while (!num.empty()) { cout << num.top() << endl; num.pop(); } } 34 void showop() { while (!op.empty()) { cout << op.top() << endl; op.pop(); } } 35 bool checkpoint(const char *p); 36 }; 37 bool caculator::checkpoint(const char *p) 38 { 39 int i = strlen(p); 40 while (i--) 41 { 42 if (*p == '.') 43 return true; 44 *p++; 45 } 46 return false; 47 } 48 float caculator::trans(const char *p)//底层const,对象为常量 49 { 50 float n = 0; float m = 0; 51 int i = strlen(p); int j;//记录小数点后有几位 52 if (checkpoint(p)) 53 { 54 while (--i && (*p != '.')) 55 { 56 n = n * 10 + (*p - '\0' - 48); 57 *p++; 58 }--i; *p++;//跳过小数点 59 j = i; 60 m = *p - '\0' - 48;//确保转化成int后数值不变,*p指向第一位 61 while (i--) 62 { 63 *p++; 64 m = m * 10 + (*p - '\0' - 48); 65 } 66 return n + m*pow(0.1, j + 1); 67 } 68 else 69 { 70 while (i--) 71 { 72 n = n * 10 + (*p - '\0' - 48); 73 *p++; 74 } 75 return n; 76 } 77 } 78 void caculator::readnum() 79 { 80 str = ss.str(); 81 if (!str.empty())//str中存放数字串 82 { 83 ss.str("");//清空流 84 num.push(trans(str.c_str())); 85 } 86 } 87 void caculator::caucEveTime()//由符号栈弹出符号决定调用 88 { 89 y = num.top(); 90 num.pop(); 91 x = num.top(); 92 num.pop(); 93 switch (op.top()) 94 { 95 case'+':num.push(x + y); break; 96 case'-':num.push(x - y); break; 97 case'*':num.push(x*y); break; 98 case'/':num.push(x / y); break; 99 default:break; 100 } 101 } 102 float caculator::antipoland() 103 { 104 for (int i = 0; i < s.size(); i++) 105 switch (s[i]) 106 { 107 case '(':op.push(s[i]); readnum(); break; 108 case '+': 109 case '-': 110 readnum(); 111 while (op.top() != '(' && !op.empty()) 112 { 113 if (op.top() != '('&&op.top() != ')') 114 { 115 sb << op.top(); 116 } 117 op.pop(); 118 } 119 op.push(s[i]); 120 121 break; 122 case ')': 123 readnum(); 124 while (op.top() != '(') 125 { 126 sb << op.top(); 127 caucEveTime(); 128 op.pop(); 129 }op.pop(); break; 130 case '*': 131 case'/': 132 readnum(); 133 while (op.top() == '*' || op.top() == '/') 134 { 135 sb << op.top(); 136 caucEveTime(); 137 op.pop(); 138 }op.push(s[i]); break; 139 default: 140 sb << s[i]; 141 ss << s[i]; 142 break; 143 } 144 str = ss.str(); 145 if (!str.empty()) 146 num.push(trans(str.c_str())); 147 148 while (!op.empty()) 149 { 150 if (op.top() != '('&&op.top() != ')') 151 { 152 sb << op.top(); 153 caucEveTime(); 154 } 155 op.pop(); 156 } 157 158 strs = sb.str(); 159 return num.top(); 160 } 161 void main() 162 { 163 char ch[40]; 164 char *p = ch; 165 cin >> p; 166 caculator a(p); 167 //a.antipoland();//两次重复调用改变数字栈中的数字! 168 //a.show(); 169 //cout << endl; 170 cout << "=" << a.antipoland() << endl; 171 // cout << endl; 172 //a.shownum(); 173 //a.showop(); 174 }