POJ--2269(逆波兰式)
2015-01-23 21:00:44
思路:用逆波兰式计算算术表达式。
总结下逆波兰式步骤:
建立逆波兰式数组,以及操作符stack,从头开始扫描表达式
(1)若是数值,则加入数组末尾
(2)若是操作符,那么和stack中栈顶操作符进行对比
(i)如果当前操作符是'(',那么直接入栈
(ii)如果当前操作符是')',那么一个一个地将栈顶元素加入数组末尾,直到遇到'('
(iii)如果当前操作符优先级<=栈顶元素,那么将栈顶元素加入数组末尾...不断这么做,直到当前操作符元素>站顶元素 or 栈空
(3)若处理完后stack不为空,那么逐个将栈中元素加入数组末尾。
注意:
用一个int来记每个group,如第一个二进制位记A。
那么:a+b就是a|b,a-b就是a - (a&b),a*b就是a&b
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cmath> 5 #include <vector> 6 #include <map> 7 #include <set> 8 #include <stack> 9 #include <bitset> 10 #include <queue> 11 #include <string> 12 #include <iostream> 13 #include <algorithm> 14 using namespace std; 15 16 #define MEM(a,b) memset(a,b,sizeof(a)) 17 #define REP(i,n) for(int i=1;i<=(n);++i) 18 #define REV(i,n) for(int i=(n);i>=1;--i) 19 #define FOR(i,a,b) for(int i=(a);i<=(b);++i) 20 #define RFOR(i,a,b) for(int i=(a);i>=(b);--i) 21 #define MP(a,b) make_pair(a,b) 22 23 typedef long long ll; 24 typedef pair<int,int> pii; 25 const int INF = (1 << 30) - 1; 26 27 char s[300]; 28 int rev[300],r; 29 stack<int> op; 30 stack<int> num; 31 32 int main(){ 33 while(gets(s + 1)){ 34 int val = 0,len = strlen(s + 1); 35 while(!op.empty()) op.pop(); 36 r = 0; 37 REP(i,len){ 38 if(s[i] >= 'A' && s[i] <= 'Z'){ 39 val |= (1 << (s[i] - 'A')); 40 } 41 else if(s[i] == '}'){ 42 rev[++r] = val; 43 val = 0; 44 } 45 else{ 46 if(s[i] == '(') op.push(-4); 47 else if(s[i] == ')'){ 48 while(!op.empty() && op.top() != -4){ 49 rev[++r] = op.top(); 50 op.pop(); 51 } 52 op.pop(); 53 } 54 else if(s[i] == '+' || s[i] == '-'){ 55 while(!op.empty() && op.top() >= -3){ 56 rev[++r] = op.top(); 57 op.pop(); 58 } 59 if(s[i] == '+') op.push(-1); 60 else op.push(-2); 61 } 62 else if(s[i] == '*') op.push(-3); 63 } 64 } 65 while(!op.empty()){ 66 rev[++r] = op.top(); 67 op.pop(); 68 } 69 while(!num.empty()) num.pop(); 70 REP(i,r){ 71 if(rev[i] >= 0) num.push(rev[i]); 72 else{ 73 int v2 = num.top(); num.pop(); 74 int v1 = num.top(); num.pop(); 75 if(rev[i] == -1) num.push(v1 | v2); 76 else if(rev[i] == -2) num.push(v1 - (v1 & v2)); 77 else num.push(v1 & v2); 78 } 79 } 80 int ans = num.top(); 81 printf("{"); 82 FOR(i,0,25) if(ans & (1 << i)) printf("%c",'A' + i); 83 printf("}\n"); 84 } 85 return 0; 86 }