我最爱的冯老师在离散课上出了一个附加题。
为了能够加更多的学分也是出于自己的好奇,我决定尝试一下。
思路:二进制枚举+逆波兰表达式
#include<stdio.h>
#include<string.h>
#define T 1
#define F 0
struct Stack{
int top;
char arr[80];
}number={
-1},symbol={
-1};
//number储存后缀表达式结果
//symbol 操作符栈,用来保存操作符
int book[26];//记录变元元素和个数
//a对应下标为0
//b对应下标为1
//c对应下标为2
//以此类推
int num=0;//记录变元的个数
int alphabet_true_false[26];
/*
上面的book数组每个元素存放的是
该下标对应的字母是否存在
类似的这个alphabet_true_false存放的是
该下标对应的字母变元的真值(true or false)
当然,只有book[i]不为零的情况下该数组才会奏效
*/
int enum_result[80];
/*
如果二进制值为110110010
那么该数组从前往后数每个元素分别为:
1 1 0 1 1 0 0 1 0
说白了就是把十进制转为二进制01值并存到enum_result里罢了
*/
char str_copy[80];//输入的字符串的副本
void count_num(char str[]){
//记录变元的个数,用全局变量num储存
int i,len=strlen(str);
for(i=0;i<len;i++){
if(str[i]>='a'&&str[i]<='z'){
if(book[str[i]-'a']==0){
book[str[i]-'a']=1;
++num;
}
}
}
}
void scan_string(char str[]){
//输入小写字符
//例如!(p|q)>(q&!r|(r>p))
int i;
gets(str);
strcpy(str_copy,str);
count_num(str);//记录变元的个数,用全局变量num储存
int len=strlen(str);
for(i=0;i<len;i++){
//对操作符进行优先级处理
//把字符数组的操作符改为计算机可判断优先级的特别字符
switch(str[i]){
case '!':str[i]=')'+5;break;
case '&':str[i]=')'+4;break;
case '|':str[i]=')'+3;break;
case '>':str[i]=')'+2;break;
case '=':str[i]=')'+1;break;
}
}
}
<