#include <string>
#include <iostream>
using namespace std;
#include "CStack.h"
/*
//接收:一个int型变量,并且通过此变量返回字符串中变元的数量(去掉了重复的)
//返回:string变量(公式)
*/
string Get(int & num,string &val_str);
string Translate(const string &str);
void Sort(string &str);
void CreateList(int * num_a,const int & num);
void PlusList(int * num_a,const int & num);
void Print(const string & str,const int & num,string & val_str);//打印结果
int Calculate(int value1,char mark,int value2);
int Result(const string & str);
int main()
{
string val_str,str;
int num;
int i=0;
while(i<100)
{
str=val_str="";
str=Get(num,val_str);
Print(str,num,val_str);
}
return 0;
}
string Get(int & num,string &val_str) //还要返回变元数组
{
string temp;//接受公式
int tmp_num=0;
int i=0,k=0,n=0,j=-1;
string tmp_str="00000000000000000000000000";//储存不重复的变元
cout<<"请输入公式:";
cin>>temp;
for(i=0;i<temp.length();++i)
{
if(temp[i]>='a'&&temp[i]<='z')
temp[i]-='a'-'A';//全部化为大写
if(temp[i]>='A' && temp[i]<='Z')
{
j++;
++tmp_num;
tmp_str[j]=temp[i];
for(k=i-1;k>=0;--k)
{
if(temp[k]==temp[i])
{
--tmp_num;
tmp_str[j--]='0';
break;
}
}
}
}
num=tmp_num;
string t_string(tmp_str,0,num);
val_str=t_string;
return temp;
}
int Calculate(int value1,char mark,int value2)
{
switch(mark)
{
case '&':
return value1*value2; //与运算
case '|':
return value1+value2 >=1 ? 1:0;
case '=':
return value1==value2 ? 1:0;
case '>':
return value1==1 && value2==0 ? 0 : 1 ;
case '~': //value1无效
return !value2;
default:
return -1; //返回错误
}
}
int Result(const string & str)
{
int length=str.length();
CStack s;
s.InitStack();
char ch1,mark,ch2,top;
ch1=mark=ch2=' ';
int i=0;
s.Push(str[i++]);
while(!s.StackOnly()||i<length)
{
if(i<length)
s.Push(str[i]);
if(s.GetTop()==')')
{
s.Pop(ch2);//ch2的值为'(' 不需将此值压入栈
s.Pop(ch1);//ch1保存了()中间的值
s.Pop(ch2);//ch2的值为')' 不需将此值压入栈
s.Push(ch1);
}
switch(s.GetLastTop())
{
case '&':
case '|':
case '=':
case '>':
if(s.GetTop()=='(')
break;
s.Pop(ch2);
s.Pop(mark);
s.Pop(ch1);
if(Calculate(ch1-'0',mark,ch2-'0'))
s.Push('1');
else
s.Push('0');
break;
case '~':
if(s.GetTop()=='(')
break;
s.Pop(ch2);
s.Pop(mark);
if(Calculate(0,mark,ch2-'0'))
s.Push('1');
else
s.Push('0');
break;
default:
break;
}//switch
++i;
}//while
if(s.GetTop()=='1')
return 1;
else
return 0;
}//Result()
string Translate(const string &str)
{
int i=0,length=str.length();
string str_ok;//保存转换好了的公式
for(i=0;i<length;++i)
{
switch(str[i])
{
case '|':
case '&':
++i;
str_ok+=str[i];
break;
case '!':
str_ok+='~';
break;
case '<':
++i;
str_ok+='=';
break;
case '-':
++i;
str_ok+='>';
break;
default:
str_ok+=str[i];
}
}
return str_ok;
}
void CreateList(int * num_a,const int & num)//初始化真值表数组
{
int i=0;
for(i=0;i<num;++i)
num_a[i]=0;
num_a[num-1]=-1;
}
void PlusList(int * num_a,const int & num)
{
num_a[num-1]+=1; //每次调用此函数都加一
int i=0;
for(i=num-1;i>=0;--i)
{
if(num_a[i]>1)
{
num_a[i]=0;
num_a[i-1]+=1;
}//小心越界
}
}
void Print(const string & str,const int & num,string & val_str)
{
int i=0,j=0,k=0,n=0,m=0,mi=1,length;//mi为幂
Sort(val_str);//排序
cout<<"__★__★__★__★结果★__★__★__★__"<<endl;
for(i=0;i<num;++i)
cout<<val_str[i]<<'\t';
cout<<str<<endl;
string str_tmp=Translate(str);//转换
string str_tred;
length=str_tmp.length();
for(k=1;k<=num;++k)
mi*=2;
int * num_a;
num_a=new int[num];
CreateList(num_a,num);//创建真值表数组
for(i=0;i<mi;++i)
{
str_tred=str_tmp;//初始化str_tred
PlusList(num_a,num);// +1
for(m=0;m<num;++m)
cout<<num_a[m]<<'\t';//输出每一项取值
for(j=0;j<num;++j)
{
for(n=0;n<length;++n)
{
if(str_tred[n]==val_str[j])
str_tred[n]=num_a[j]+'0';//将int型转换为char型
}
}
cout<<Result(str_tred)<<endl;//输出最终结果
}
cout<<"__☆__☆__☆__☆YEnd☆__☆__☆__☆__"<<endl;
}
void Sort(string &str)
{
char ch_tmp;
int length=str.length();
int i=0,j=0;
for(i=0;i<length-1;++i)
{
for(j=i+1;j<=length-1;++j)
{
if(str[i]>str[j])
{
ch_tmp=str[i];
str[i]=str[j];
str[j]=ch_tmp;
}
}
}
}