# include "stdio.h"
# include "ctype.h"
# include "string.h"
# include "stdlib.h"
# include "math.h"
# define MAXSIZE 100
typedef char elemtype;
typedef struct{
/*定义栈结构*/
elemtype data[MAXSIZE];
/*定义栈的大小*/
int top;
/*定义栈的指针*/
}sqstack;
void init_sqsqstack(sqstack*S){
/*初始化栈*/
S->top = -1;
/*栈底定义为-1,用来判断是否为空*/
}
int empty_sqstack(sqstack*S){
/*判断栈是否为空*/
if (S->top==-1)
/*栈指针值为-1,则栈是为空并返回 1*/
return 1;
else
return 0;
/*栈指针值不为-1,则栈不为空,此时返回 0*/
}
void push_sqstack(sqstack*S,elemtype x){
/*入栈,当栈满时提示*/
if (S->top==MAXSIZE-1)
/*栈指针值为最大值(MAXSIZE)-1,则栈
已经满,此时提示无法执行入栈*/
{printf("出现错误!");return;}
else
/*否则可以执行入栈操作*/
S->data[++(S->top)]=x;
}
void pop_sqstack(sqstack *S,elemtype *x){
/*出栈,当栈满时提示*/
if(S->top==-1)
/*判断栈是否为空,为空则提示*/
{ printf("出现错误!");return;}
else{
/*栈不为空,读取栈的内容,并使指针移向下一个*/
*x = S->data[S->top];
S->top--;
}
}
void top_sqstack(sqstack*S,elemtype*x){
/*读取栈中的内容,但不移动指针*/
if(S->top==-1)
/*判断栈是否为空,为空则提示*/
{printf("出现错误!");return;}
else
/*栈不为空,读取栈的内容,但指针移不移动*/
*x = S->data[S->top];
}
int pre(char op){
/*定义不同优先级*/
switch (op){
case'>':
case'=':return 1; break;
case'|':return 2; break;
/*‘>’‘=’“|”“&”“~”优先级依次升高*/
case'&':return 3; break;
case'~':return 4; break;
case'(':
case'#':
default:return 0; break;
/*其他符号只用返回‘0’即可。有用时可以用来判断*/
}
}
void transform(char suffix[],char exp[]){
/*将数字中缀表达式exp转换为后缀表达式suffix*/
sqstack S;
/*新定义一个栈*/
char ch;
int i=0,j=0;
/*定义相关使用参量*/
init_sqsqstack(&S);
/*初始化这个栈*/
push_sqstack(&S, '#');
/*在栈低放入‘#’来判断栈是否没有其他东西*/
while(exp[i]!='\0'){
/*扫描exp 只要不是空就继续执行*/
ch = exp[i];
/*将字符放在ch中,以方便以后使用*/
switch(ch){
/*检验数组中的字符*/
case'(':push_sqstack(&S,exp[i]);i++;break;
/*当字符为‘(’时,直接将其压入栈中*/
case')':while(S.data[S.top]!='('){
/*当字符为‘)’时,将栈中所有字符全部
出栈并放入suffix中,直到遇到'('*/
pop_sqstack(&S,&ch);suffix[j++] = ch;
}
pop_sqstack(&S,&ch);
/*将最后一个'('的空间释放*/
i++;
/*寻找下一个*/
break;
/*跳出这次匹配*/
case'|':
case'&':
case'~':
case'=':
case'>':
while(pre(S.data[S.top])>=pre(exp[i])){
/*当字符为'|','&','~'时,判断其优先级。
当前运算符大于当栈中的优先级时执行以下*/
pop_sqstack(&S,&ch);
/*当条件成立时,接将其出栈与现有字符交换*/
suffix[j++] = ch;
}
push_sqstack(&S,exp[i]);
i++;
/*寻找下一个*/
break;
/*跳出这次匹配*/
default:while(isdigit(exp[i])){
/*其他情况如果是数字的话直接放入suffix中*/
suffix[j++] = exp[i];
i++;
/*寻找下一个*/
}
}
}
while(S.data[S.top]!='#'){
/*最后将栈中剩余的放入suffix中*/
pop_sqstack(&S,&ch);suffix[j++] = ch;
}
suffix[j]='\0';
/*以字符结束符结束字符串suffix*/
}
int calculate_exp(char exp[]){
/*计算一个后缀表达式的值*/
sqstack S;
/*新定义一个栈*/
int i=0;
char x,x1,x2;
/*定义相关使用参量*/
init_sqsqstack(&S);
/*初始化这个栈*/
while(exp[i]!='\0'){
/*扫描exp 只要不是空就继续执行*/
switch(exp[i]) {
//对字符串从头扫描
case'|':
//当字符为'|'时,计算
pop_sqstack(&S,&x2);
pop_sqstack(&S,&x1);
//取栈中的两个数据分别放在x1,x2中
x = (x1-'0')||(x2-'0');
// 将字符转化为整型数并进行相关计算
push_sqstack(&S,(x+'0'));
// 将计算结果转化为字符并压入字符串中
i++;break;
//跳出寻找下一次
case'=':
pop_sqstack(&S,&x2);
pop_sqstack(&S,&x1);
x = (x1==x2);
push_sqstack(&S,(x+'0'));
i++;break;
case'>':
pop_sqstack(&S,&x2);
pop_sqstack(&S,&x1);
x = !(x1-'0')||(x2-'0');
push_sqstack(&S,(x+'0'));
i++;break;
case'&':
pop_sqstack(&S,&x2);
pop_sqstack(&S,&x1);
x = (x1-'0')&&(x2-'0');
push_sqstack(&S,(x+'0'));
i++;break;
case'~':
pop_sqstack(&S,&x1);
x = !(x1-'0');
push_sqstack(&S,(x+'0'));
i++;break;
//基本同上
default:
//对于是数字直接入栈
while(exp[i]=='0'||exp[i]=='1')
{push_sqstack(&S,exp[i]);i++;}
}
}
if(!empty_sqstack(&S)){
//判断栈是否为空,若为空则提示表达是错误,否则输出答案
pop_sqstack(&S,&x);
if(empty_sqstack(&S))
return (int)(x-'0');
else
return 5;
}
else return 1;
}
got(char s2[],char s1[]){
/*提取出一个表达式中的字母,及其数目。以便以后运算使用*/
int i = 0,k,j=0;
while(s1[i]!='\0'){
if((s1[i]>='A')&&(s1[i]<='Z'||s1[i]>='a')&&(s1[i]<='z')){
for(k=0;k<j;k++){
if (s1[i]==s2[k])
break;
}
if (k==j)
s2[j++] = s1[i];i++;
}
else if((s1[i]=='|')||(s1[i]=='&')||(s1[i]=='~')
||(s1[i]=='=')||(s1[i]=='>')||(s1[i]=='(')||(s1[i]==')'))
i++;
else
return 0;
}
s2[j]='\0';
return j;
}
void digit(int n,char s1[],char s2[] ){
/*将一个字母表达式中的字母用对应于n的数字代替*/
int i,j,num[30];
for(i=0;i<(int)strlen(s1);i++){
num[i] = (n/(int)pow(2,i)%2);
}
i=0;
while(s2[i]!='\0'){
for(j=0;j<(int)strlen(s1);j++){
if (s2[i]==s1[j])
s2[i] = num[j] + '0';
}
i++;
}
}
void truetable(){
/*求真值表函数*/
char s1[30],s2[30],s3[30],s4[30];
int n,i,j,k,m;
//定义使用变量
printf("您要计算真值表!\n");
printf("***************** 输入要计算的表达式(A~Z,a~z) ****"
"************ \n");
printf("(其中'&'代表与 '|'代表或 '~'代表非 '>'代表单条件 "
"'='代表双条件)\n");
//界面部