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 }

 

 

posted @ 2015-01-23 21:11  Naturain  阅读(240)  评论(0编辑  收藏  举报