| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
苍天啊,大地啊!谁给我出这口客气,为啥老是WA!!
以下是我的代码
我是 按优先级顺序 ~ > & > ^ > |
处理的
希望牛人给个本程序错误的数据!!
跪求!!!
多谢!!!!!
#include <iostream.h>
#include <memory.h>
#include<stdio.h>
struct stack{
int top;
char data[300];
};
struct boolStack{
int top;
bool data[300];
};
char a[300];
char d1[300];
char d2[300];
stack ss1,ss2;
boolStack ss3;
bool used[100];
int idx[100];
bool ever[100];
int n;
int getIndex();
void getHouZhuiShi(int front,int rear);
bool getValue(char *d,int ld);
void main(){
int i,j,k,ld1,ld2;
int num;
int len;
int index = 0;
cin>>num;
for(i=1;i<=num;i++){
gets(a+1);
j=1;
n = 1;
memset(ever,0,sizeof(ever));
while(a[j]){
if(a[j]>='a'&&a[j]<='z'&&!ever[a[j]-'a'+1])
{
ever[a[j]-'a'+1] = true;
idx[a[j]-'a'+1] = n;
n++;
}
j++;
}
len = j-1;
n--;
index = getIndex();
getHouZhuiShi(1,index);
j=1;
ld1 = ss1.top + 1;
while(ss1.top>=0)
{
d1[j++] = ss1.data[ss1.top--];
}
getHouZhuiShi(index+1,len);
j = 1;
ld2 = ss1.top+1;
while(ss1.top>=0)
{//cout<<"ss1.top = "<<ss1.top<<endl;
d2[j++] = ss1.data[ss1.top--];
}
// cout<<"d1 = "<<(d1+1)<<endl;
// cout<<"d2 = "<<(d2+1)<<endl;
memset(used,0,sizeof(used));
//cout<<"memset"<<endl;
bool b1,b2;
bool flag = true;
while(!used[n+1]){
//for(k=1;k<=n;k++){
//cout<<used[k]<<",";
//}cout<<endl;
b1 = getValue(d1,ld1);
b2 = getValue(d2,ld2);
// cout<<"b1 = "<<b1<<", b2 = "<<b2<<endl;
if(b1!=b2){
flag = false;
break;
}
j = 1;
while(used[j]){used[j] = false;j++;}
used[j] = true;
}
if(flag){
cout<<"Data set "<<i<<": Equivalent"<<endl;
}
else cout<<"Data set "<<i<<": Different"<<endl;
}
return;
}
bool getValue(char *d,int ld){
int i;
i = 1;
bool a1,a2;
ss3.top = -1;
while(i<=ld){
//cout<<"d["<<i<<"] = "<<d[i]<<endl;
if(d[i]>='a'&&d[i]<='z'){
while(d[i]>='a'&&d[i]<='z'){
ss3.data[++ss3.top] = used[idx[d[i]-'a'+1]];
i++;
}
continue;
}
switch(d[i]){
case '|':
a1 = ss3.data[ss3.top--];
a2 = ss3.data[ss3.top--];
ss3.data[++ss3.top] = (a1||a2);
break;
case '&':
a1 = ss3.data[ss3.top--];
a2 = ss3.data[ss3.top--];
ss3.data[++ss3.top] = (a1&&a2);
break;
case '^':
a1 = ss3.data[ss3.top--];
a2 = ss3.data[ss3.top--];
ss3.data[++ss3.top] = (!a1&&a2||a1&&!a2);
break;
case '~':
a1 = ss3.data[ss3.top--];
ss3.data[++ss3.top] = (!a1);
break;
}
i++;
}
return ss3.data[0];
return false;
}
void printss1(){
int i;
cout<<"ss1 : ";
for(i=0;i<=ss1.top;i++){
cout<<ss1.data[i];
}cout<<endl;
}
void printss2(){
int i;
cout<<"ss2 : ";
for(i=0;i<=ss2.top;i++){
cout<<ss2.data[i];
}cout<<endl;
}
void getHouZhuiShi(int front,int rear){
int i;
//cout<<"front = "<<front<<endl;
//cout<<"rear = "<<rear<<endl;
ss1.top = -1;//符号栈
ss2.top = -1;//数字栈
char ch;
for(i=front;i<=rear;i++){
switch(a[i]){
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
case 'g':
case 'h':
case 'i':
case 'j':
case 'k':
case 'l':
case 'm':
case 'n':
case 'o':
case 'p':
case 'q':
case 'r':
case 's':
case 't':
case 'u':
case 'v':
case 'w':
case 'x':
case 'y':
case 'z':
ss2.data[++ss2.top] = a[i];
break;
case '|':
while(ss1.top>=0){
ch = ss1.data[ss1.top--];
if(ch == '('){
ss1.data[++ss1.top] = ch;
break;
}
ss2.data[++ss2.top] = ch;
}
ss1.data[++ss1.top] = a[i];
break;
case '^':
while(ss1.top>=0){
ch = ss1.data[ss1.top--];
if(ch == '('||ch=='|'){
ss1.data[++ss1.top] = ch;
break;
}
ss2.data[++ss2.top] = ch;
}
ss1.data[++ss1.top] = a[i];
break;
case '&':
while(ss1.top>=0){
ch = ss1.data[ss1.top--];
if(ch == '('||ch=='|'||ch=='&'){
ss1.data[++ss1.top] = ch;
break;
}
ss2.data[++ss2.top] = ch;
}
ss1.data[++ss1.top] = a[i];
break;
case '~':
while(ss1.top>=0){
ch = ss1.data[ss1.top--];
if(ch == '('||ch=='|'||ch=='&'||ch=='^'||ch=='~'){
ss1.data[++ss1.top] = ch;
break;
}
ss2.data[++ss2.top] = ch;
}
ss1.data[++ss1.top] = a[i];
break;
case '(':
ss1.data[++ss1.top] = a[i];
break;
case ')':
while(ss1.top>=0){
ch = ss1.data[ss1.top--];
if(ch == '(') break;
ss2.data[++ss2.top] = ch;
}
break;
default: break;
}
// printss1();
// printss2();
}
while(ss2.top>=0){
ss1.data[++ss1.top] = ss2.data[ss2.top--];
}
//int top = ss1.top;
//while(top>=0){
//cout<<ss1.data[top--];
//}
//cout<<endl;
}
int getIndex(){//区分两个 式子
bool v=false,p=true;
int i = 1;
while(a[i]){
//cout<<"v = "<<v<<", p = "<<p<<endl;
if(v&&p&&(!(a[i]==' '||a[i]=='|'||a[i]=='&'||a[i]=='^')))
{
return (i-1);
}
else{
if(a[i]>='a'&&a[i]<='z')
{
v = true;
}
else if (a[i] == '~')
{
v = false;
}
else if(a[i]=='|'||a[i]=='^'||a[i]=='&')
{
v = false;
}
else if(a[i]=='(')
{
v = true;
p = false;
}
else if(a[i]==')'){
p = true;
}
}
i++;
}
return -1;
}
/*
*/
Followed by:
Post your reply here: |