数据结构题集51推荐.docx
- 文档编号:23255522
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:23
- 大小:155.72KB
数据结构题集51推荐.docx
《数据结构题集51推荐.docx》由会员分享,可在线阅读,更多相关《数据结构题集51推荐.docx(23页珍藏版)》请在冰豆网上搜索。
数据结构题集51推荐
课程设计
课程名称数据结构
题目名称5.1重言式判别(难度4)
学生学院计算机学院
专业班级软件工程1104
学号3111006218
学生姓名陈雪桂
指导教师李扬
2013年6月29日
重言式的判别
题目:
一个逻辑表达式如果对于其変元的任一种取值都为真,则称为重言式;反之,如果对于其变元的任一种取值都为假,则称为矛盾式;然而,更多的情况下,既非重言式,也非矛盾式。
试写一程序,通过真值表判别一个逻辑表达式属于上述哪一类。
一、需求分析
1、逻辑表达式从终端输入,长度不超过一行。
2、逻辑运算符包括“|”“&”“~”表示或与非。
运算符优先程度递增,但是可由括号改变。
3、逻辑变元为大写字母表达式中任何地方都可以含有多个空格符。
4、运用自底向上的算符优先法
5、重言式显示“trueforever”;矛盾式显示“falseforever”;
否则显示“satisfactible”。
二、概要设计
为实现上述需求需要用到自底向上的算符优先法,和自顶向下分割,先序遍历建立二叉树的方法。
1、主程序模块
intmain(){
intchoice;
init();
printf("*************************************************\n");
printf("重言式的判别\n");
printf("*************************************************\n");
do
{
input();
CreatBiTree();
mutualcm();
printf("-------------------------------------------------\n");
printf("是否继续判别:
1、继续;2、结束\n");
DestroyBiTree(root);
scanf("%d",&choice);
}while(choice==1);
destroy();
return0;
}
2、逻辑运算符的优先级判别模块
自底向上的算符优先法:
charOPTRCHART[7][7]=
{
'','|','&','~','(',')','#',
'|','>','<','<','<','>','>',
'&','>','>','<','<','>','>',
'~','>','>','>','<','>','>',
'(','<','<','<','<','=','>',
')','>','>','>','>','>','>',
'#','<','<','<','<','<','='
};
两运算符的优先级的比较算法:
charcmp(chara,charb)
{
inti,j;
for(i=1;i<6;i++)
{
if(optrtable[i][0]==a)
break;
}
for(j=1;j<7;j++)
{
if(optrtable[0][j]==b)
break;
}
returnoptrtable[i][j];
}
3、对栈的操作模块
栈的定义:
typedefstructNode
{
BiTree*base;
BiTree*top;
intstacksize;
}SqStack;
基本操作的函数原型说明:
intInitStack(SqStack*stack);
操作结果:
构造一个空栈S。
intPush(SqStack*stack,BiTreeBitnode);
初始条件:
栈S已存在。
操作结果:
在栈S的栈顶插入新的栈顶元素e。
BiTreePop(SqStack*stack);
初始条件:
栈S已存在且非空。
操作结果:
删除S的栈顶元素,并以e返回其值。
BiTreeGetTop(SqStack*stack);
初始条件:
栈stack存在且非空
操作结果:
返回栈顶元素,否则返回null
intDestroyStack(SqStack*stack);
初始条件:
栈S已存在。
操作结果:
释放栈S占有的内存空间,将栈销毁。
4、二叉树的建立模块
二叉树的节点类型定义:
typedefstructBiTNode
{
chardata;
structBiTNode*lchild;
structBiTNode*rchild;
}BiTNode,*BiTree;
基本操作的函数原型说明:
voidCreatBiTree();
操作结果:
根据输入的表达式,构造一棵树
voidDestroyBiTree(BiTreetree);
初始条件:
tree不为空
操作结果:
删除该树
intGetValue(BiTreetree);
初始条件:
该树节点不为空
操作结果:
返回树的值,否则返回0
5、其他函数原型说明
voidinit();
操作结果:
初始化栈OPTR、OPND和树
voiddestroy();
操作结果:
销毁栈OPTR、OPND
voidinput();
操作结果:
输入变量个数以及表达式
voidmutualcm();
操作结果:
对应建成的树进行各个变量取不同情况的验证
voidVaritab(intn);
操作结果:
使varitab数组varitab[1-n]取得一种情况的验证(n为变量个数,程序中储存
在varitab[0]中)
voidtable();
操作结果:
计算机列出各种不同的情况,被给予判断
3、详细设计
由于代码比较多只画函数流程图,源代码在附录文件
函数调用流程图:
四、调试分析
1、设计程序开始的时候,发现树的概念不清,且遍历不懂。
翻书查阅解决。
2、树的建立过程一直出错,节点掌握不足。
3、开始没用优先级考虑,结果得不到要的结果,参照另一程序明白优先级的操作。
4、scanf("%d",&cmd);此句忘加&号结果输入后程序就终止,粗心导致。
5、stack->base=(BiTree*)realloc(stack->base,(stack->stacksize+STACKINCREAMENT)*sizeof(BiTree));此句原来写的事stack->base=(BiTree*)malloc((stack->stacksize+STACKINCREAMENT)*sizeof(BiTree));程序无法执行,不知为什么。
6、stack->base=(BiTree)malloc(stack->stacksize*(sizeof(BiTree)))此句本来在(BiTree*)结果报多*去掉没问题,但是不明白
五、用户手册
本程序采用需要用户输入或者判别的时候步步都有提示如图所示
六、测试结果
需要测试的数据为:
(1)(A|~A)&(B|~B)
(2)(A&~A)&C
(3)A|B|C|D|E|~A
(4)A&B&C&~B
(5)(A|B)&(A|~B)
(6)A&~B|~A&B;0,0;0,1;1,0;1,1。
测试结果如图所示:
7、源代码
#include
#include
#include
#include
#defineOK1
#defineERROR0
#defineVARIMAXNUM20
#defineSTARMAXLEN100
#defineSTACK_INIT_SIZE100//栈的最大长度
#defineSTACKINCREAMENT10//每次增加的栈的长度
#defineElemTypechar//将elemtype定义为char型
typedefstructBiTNode//创建树节点按照书上原样创建
{
structBiTNode*Lchild;
structBiTNode*Rchild;
ElemTypedata;//字符型
}BiTNode,*BiTree;
typedefstructNode//栈
{
BiTree*base;
BiTree*top;
intstacksize;
}SqStack;
charOPTRCHART[7][7]=//此举是为了后面的优先级考虑
{
'','|','&','~','(',')','#',
'|','>','<','<','<','>','>',
'&','>','>','<','<','>','>',
'~','>','>','>','<','>','>',
'(','<','<','<','<','=','>',
')','>','>','>','>','>','>',
'#','<','<','<','<','<','='
};
intInitStack(SqStack*stack)//初始化栈
{
stack->base=(BiTree*)malloc(STACK_INIT_SIZE*sizeof(BiTree));
if(!
stack->base)
exit(OVERFLOW);
stack->top=stack->base;
stack->stacksize=STACK_INIT_SIZE;
returnOK;
}
BiTreeGetTop(SqStack*stack)//返回值为BiTree类型的取栈头
{
if(stack->top==stack->base)
returnNULL;
return*(stack->top-1);
}
intPush(SqStack*stack,BiTreeBitnode)//将树的节点放进栈的操作,入栈
{
if(stack->top-stack->base>=stack->stacksize)
{
stack->base=(BiTree*)realloc(stack->base,(stack->stacksize+STACKINCREAMENT)*sizeof(BiTree));
if(!
stack->base)
exit(OVERFLOW);
stack->top=stack->base+stack->stacksize;
stack->stacksize+=STACKINCREAMENT;
}
*(stack->top)=Bitnode;
stack->top++;
returnOK;
}
BiTreePop(SqStack*stack)//取值指针后移
{
if(stack->top==stack->base)
returnERROR;
return*(--stack->top);
}
intDestroyStack(SqStack*stack)//毁栈
{
free(stack->base);
returnOK;
}
//存表达式
charstr[STARMAXLEN];
//varitab[0]存表达式中变量个数,varitab[1-varitab[0]]存入各变量不同取值情况
intvaritab[VARIMAXNUM+1];
//2^(变量个数)
intsum;
//二叉树根节点
BiTreeroot;
//OPTR存放有父级操作符的树节点没有自己子节点(节点值可以操作数也可以操作符)
//OPND存放缺少父级操作符节点
SqStackOPTR,OPND;
charcmp(chara,charb)//取左右交叉的符号即“<”“>”“=”
{
inti,j;
for(i=0;i<=6;i++)
{
if(OPTRCHART[i][0]==a)
break;
}
for(j=0;j<=6;j++)
{
if(OPTRCHART[0][j]==b)
break;
}
returnOPTRCHART[i][j];
}
//建树
voidCreatBiTree()
{
BiTreetemp,a,b;
char*p=str;
temp=(BiTree)malloc(sizeof(BiTNode));
temp->data='#';
Push(&OPTR,temp);
while((*p!
='#')||(GetTop(&OPTR)->data!
='#'))
{
if((*p>=65)&&(*p<=90)||(*p>=97)&&(*p<=122))
{
temp=(BiTree)malloc(sizeof(BiTNode));
temp->data=*p;
temp->Lchild=NULL;
temp->Rchild=NULL;
Push(&OPND,temp);
p++;
}
else
{
switch(cmp(GetTop(&OPTR)->data,*p))//开始判断优先级
{
case'<':
temp=(BiTree)malloc(sizeof(BiTNode));
temp->data=*p;
temp->Lchild=NULL;
temp->Rchild=NULL;
Push(&OPTR,temp);
p++;
break;
case'=':
temp=Pop(&OPTR);
free(temp);
p++;
break;
case'>':
temp=Pop(&OPTR);
b=Pop(&OPND);
temp->Rchild=b;
if(temp->data!
='~')
{
a=Pop(&OPND);
temp->Lchild=a;
}
Push(&OPND,temp);
break;
}/*switch*/
}/*else*/
}/*while*/
root=Pop(&OPND);
temp=Pop(&OPTR);
free(temp);
}
//销毁树并取出需要的值
voidDestroyBiTree(BiTreetree)
{
if(!
tree){
return;
}
elseif((tree->Lchild==NULL)&&(tree->Rchild==NULL)){
free(tree);
return;
}
else{
DestroyBiTree(tree->Lchild);
DestroyBiTree(tree->Rchild);
free(tree);
}
}
intGetValue(BiTreetree)
{
if(!
tree)
{
return0;
}
elseif((tree->data>=65)&&(tree->data<=90))
{
returnvaritab[tree->data-64];
}
elseif((tree->data>=97)&&(tree->data<=122))
{
returnvaritab[tree->data-96];
}
else
{
switch(tree->data)
{
case'|':
return(GetValue(tree->Lchild)||GetValue(tree->Rchild));
case'&':
return(GetValue(tree->Lchild)&&GetValue(tree->Rchild));
case'~':
return(!
GetValue(tree->Rchild));
}
}
}
voiddestroy()//销毁栈
{
DestroyStack(&OPTR);
DestroyStack(&OPND);
}
voidinit()
{
InitStack(&OPTR);
InitStack(&OPND);
*varitab=0;
sum=(int)pow(2.0,*varitab);
root=NULL;
str[0]='#';
}
voidinput()
{//为了能继续输入需要判别的式子
char*p,*q;
printf("请输入要判断的表达式中变量个数\n");
scanf("%d",varitab);
while(*varitab<0)
{
printf("错误,请重新输入数字!
\n");
printf("请输入要判断的式子中变量的数目:
\n");
scanf("%d",varitab);
}
getchar();
sum=(int)pow(2.0,*varitab);
printf("输入要判别的表达式:
\n");
gets(str);
//将str表达式中空格过滤,存放进*q
for(p=q=str;*p;p++)
if(*p!
='')
*q++=*p;
*q='#';
}
//实现让varitab[1..*varitab]取一种情况,*varitab为变量个数,
//当*varitab=2,当n=0时,varitab[1]=0,varitab[2]=0等四种情况,由传入不同n决定
voidVaritab(intn)
{
inti;
for(i=0;i<*varitab;i++)
varitab[*varitab-i]=(n>>i)%2;
}
//计算机列举
voidtable()
{
inti,j,value;
printf("真值表为:
\n");
for(i=1;i<=*varitab;i++)
printf("%c",64+i);
printf("\n");
for(i=0;i { Varitab(i); for(j=1;j<=*varitab;j++) printf("%d",varitab[j]); value=GetValue(root); if(value) printf("真\n"); else printf("假\n"); } } voidmutualcm() { inti,value,truenum=0,falsenum=0,cmd; for(i=0;i { Varitab(i); value=GetValue(root); if(value) truenum++; else falsenum++; } if(truenum==sum) printf("trueforever! ! \n"); elseif(falsenum==sum) printf("falseforever! ! \n"); else { printf("请进行选择1: 进行用户输入验证其它: 进行计算机列举\n"); scanf("%d",&cmd); if(cmd==1) { printf("输入变量值: \n"); for(i=1;i<=*varitab;i++) { printf("%c=",64+i); scanf("%d",varitab+i); } value=GetValue(root); if(value) printf("真! ! \n"); else printf("假! ! \n"); } else { table(); } } } intmain(){ intchoice; init(); printf("*************************************************\n"); printf("重言式的判别\n"); printf("*************************************************\n"); do { input(); CreatBiTree(); mutualcm(); printf("-------------------------------------------------\n"); printf("是否继续判别: 1、继续;2、结束\n"); DestroyBiTree(root); scanf("%d",&choice); }while(choice==1); destroy(); return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 51 推荐