题目链接:http://poj.org/problem?id=2269 题意:给出集合的表达式,在已经知道几种运算规则的情况下求表达式值。 栈的运用: #include<stdio.h> #include<string.h> #include<stdlib.h> #include<ctype.h> #define M 256 class CSet{ bool set[26]; public: CSet(){memset(set,0,sizeof(set));} CSet(bool _set[]){ memmove(set,_set,sizeof(bool)*26); } void Clr(){ memset(set,false,sizeof(bool)*26); } void Set(bool _set[]){ memmove(set,_set,sizeof(bool)*26); } CSet operator + (const CSet &tmp){ bool _set[26]; short i; for(i=0;i<26;i++) _set[i]=tmp.set[i]|set[i]; return CSet(_set); } CSet operator - (const CSet &tmp){ bool _set[26]; short i; for(i=0;i<26;i++) _set[i]=set[i]?tmp.set[i]? false:true:false; return CSet(_set); } CSet operator * (const CSet &tmp){ bool _set[26]; short i; for(i=0;i<26;i++) _set[i]=tmp.set[i]&set[i]; return CSet(_set); } void Put(){ short i; putchar('{'); for(i=0;i<26;i++) if(set[i]) putchar(i+'A'); puts("}"); } }; char s[M]; CSet stkn[M]; char stko[M]; int topn,topo; void Work(char *p) { CSet a,b; bool tmp[26]; char op; topn=topo=0; while(*p){ switch(*p){ case '{': memset(tmp,false,sizeof(tmp)); while(isalpha(*(++p))) tmp[*p-'A']=true; stkn[topn++].Set(tmp); break; case '(':stko[topo++]=*p;break; case ')': while(topo&&stko[topo-1]!='('){ op=stko[--topo];a=stkn[--topn];b=stkn[--topn]; stkn[topn++]=op=='+'?a+b:op=='-'?b-a:a*b; }if(stko[topo-1]=='(') topo--; break; case '+':case '-': while(topo&&stko[topo-1]!='('){ op=stko[--topo];a=stkn[--topn];b=stkn[--topn]; stkn[topn++]=op=='+'?a+b:op=='-'?b-a:a*b; }stko[topo++]=*p;break; case '*':stko[topo++]=*p;break; } p++; } while(topo){ a=stkn[--topn];b=stkn[--topn];op=stko[--topo]; stkn[topn++]=op=='+'?a+b:op=='-'?b-a:a*b; } } int main() { //freopen("friends1.in","r",stdin); while(~scanf("%s",s)){ //puts(s); Work(s); stkn[0].Put(); } return 0; }