一个很牛逼的学长写的代码,贴在这边记录一下。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
char CharStark[50];
char OpStark[50];
int Char_cnt=0;
int Op_cnt=0;
char Oplist[10];
int Oplist_cnt=0;
int pCh;
int pOp;
char temps[10];
char Priority_List[8][8]={
'>','<','>','>','<','>','<','>',
'>','>','>','>','<','>','<','>',
'<','<','>','>','<','>','<','>',
'<','<','<','>','<','>','<','>',
'<','<','<','<','<','=','<',0,
'>','>','>','>',0,'>','>','>',
'>','>','>','>','<','>','<','>',
'<','<','<','<','<',0,'<','='};
char TR_List[]={'|','&','~','@','(',')','!','='};
char Priority(char c,char top){
int m,n,i;
for(i=0;i<8;i++){
if(top==TR_List[i]){
m=i;
break;
}
}
for(i=0;i<8;i++){
if(c==TR_List[i]){
n=i;
break;
}
}
return Priority_List[m][n];
}
int isnewalpha(char ch){
int i;
for(i=0;i<Oplist_cnt;i++){
if(ch==Oplist[i])
return 0;
}
Oplist[Oplist_cnt++]=ch;
return 1;
}
int SitSum(int temp){
int i,sitnum=1;
for(i=0;i<temp;i++){
sitnum*=2;
}
return sitnum;
}
char Cal(char op,char a,char b){
switch(op){
case '|':
if('0'==a&&'0'==b)
return '0';
return '1';
case '&':
if('1'==a&&'1'==b)
return '1';
return '0';
case '~':
if('1'==a&&'0'==b)
return '0';
return '1';
case '@':
if(a==b)
return '1';
return '0';
case '!':
pCh++;
if('0'==b)
return '1';
return '0';
}
}
int Calculate(char c){
loop:switch(Priority(c,OpStark[pOp-1])){
case '<':
OpStark[pOp++]=c;
break;
case '=':
pOp--;
if(pOp==0)
return 0;
break;
case '>':
CharStark[pCh-2]=Cal(OpStark[pOp-1],CharStark[pCh-2],CharStark[pCh-1]);
pCh--;
pOp--;
goto loop;
}
return 1;
}
void CopytoStark(int temp){
int i=0;
while(temp>1){
temps[i++]=temp%2+48;
temp/=2;
}
temps[i]=temp+48;
while(i<Oplist_cnt){
temps[++i]='0';
}
for(i=0;i<Oplist_cnt;i++){
printf("%c ",temps[Oplist_cnt-i-1]);
}
}
void Sort(){
int i,j;
for(i=0;i<Oplist_cnt-1;i++){
for(j=i+1;j<Oplist_cnt;j++){
if(Oplist[i]>Oplist[j]){
Oplist[i]+=Oplist[j];
Oplist[j]=Oplist[i]-Oplist[j];
Oplist[i]-=Oplist[j];
}
}
}
}
int main(void){
char string[100];
int i=0,t=0;
int sitsum;
printf("鏋愬彇: | 鍚堝彇: & 绛変环: @ 钑村惈: ~ 闈? !\n");
printf("___________________________________________________________________________\n");
scanf("%s",string);
while(i<strlen(string))
{
if(isalpha(string[i]))
{
isnewalpha(string[i]);
}
i++;
}
Sort();
for(i=0;i<Oplist_cnt;i++){
printf("%c ",Oplist[i]);
}
printf(" 缁撴灉\n");
sitsum=SitSum(Oplist_cnt);
while(t<sitsum){
int j;
i=0;
pOp=1;
pCh=0;
OpStark[0]='=';
CopytoStark(t++);
while(i<strlen(string)){
if(isalpha(string[i]))
{
for(j=0;j<Oplist_cnt;j++){
if(Oplist[j]==string[i])
CharStark[pCh++]=temps[Oplist_cnt-j-1];
}
}
else
{
if(Calculate(string[i])==0)break;
}
i++;
}
printf(" %c\n",CharStark[0]);
}
system("pause");
return 0;
}