数据结构24点游戏源代码.docx
- 文档编号:6173190
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:29
- 大小:20.84KB
数据结构24点游戏源代码.docx
《数据结构24点游戏源代码.docx》由会员分享,可在线阅读,更多相关《数据结构24点游戏源代码.docx(29页珍藏版)》请在冰豆网上搜索。
数据结构24点游戏源代码
#include
#include
#include
#include
#defineOPSETSIZE7
#defineSTACK_INIF_SIZE50
#defineSTACKINCREMENT10
intnumber[2][4];
enum
{
eNumber=0,//操作数
eOperator=1//算子
};
intoper[7]={43,45,42,47,40,41,35};
charOPSET[OPSETSIZE]={'+','-','*','/','(',')','#'};
typedefstructsqlist{
intbol;//bol是0时,num-ch是一个数字;bol是1时num_ch运算符
intnum_ch;
structsqlist*next;
}sqlist;//线性表
typedefstructsqstack{
int*base;
int*top;
intstacksize;
}sqstack;//栈的定义
unsignedcharPrior[7][7]={//课本表3.1算符间的优先关系
'>','>','<','<','<','>','>',
'>','>','<','<','<','>','>',
'>','>','>','>','<','>','>',
'>','>','>','>','<','>','>',
'<','<','<','<','<','=','',
'>','>','>','>','','>','>',
'<','<','<','<','<','','='
};
intinit_sq(sqlist*l){//初始化链表
l=(sqlist*)malloc(sizeof(sqlist));
if(l==NULL){
exit(-2);
}
l->next=NULL;
return1;
}
intinsert_sq(sqlist**p,inte,intbl){//链表插入操作
sqlist*q;
q=(sqlist*)malloc(sizeof(sqlist));
q->num_ch=e;
q->bol=bl;
q->next=NULL;
(*p)->next=q;
(*p)=(*p)->next;
return1;
}
intcheck(sqlistl)//保证输入的数字是给出的四个数字
{
intright=1,find=0,i;
sqlist*q=&l;
q=q->next;
for(;q->next!
=NULL;q=q->next){
if(q->bol==1){
if(q->num_ch<=39||q->num_ch>57||q->num_ch==44||q->num_ch==46){
right=0;
printf("%c不是有效的运算符!
\n");
}
}
else{
find=0;
for(i=0;i<4;i++){
if(number[1][i]==0&&number[0][i]==q->num_ch){
number[1][i]=1;
find=1;
break;
}
}
if(find==0){
printf("%d不在给出的四个数字中!
\n",q->num_ch);
right=0;
}
}
}//endfor
for(i=0;i<4;i++){
if(number[1][i]==0){
printf("%d没有用上!
\n",number[0][i]);
right=0;
}
}
returnright;
}
intchang(char*s,sqlist*l){//将用户的输入转化为单链表
intt=0;
unsignedinti=0;
intbl,ch;
inta1,a2,a;
sqlist*p=l;
for(;i { if(s[i]>47&&s[i]<58&&t==0){ a1=(int)s[i]-48; t++; } elseif(s[i]>47&&s[i]<58&&t==1){ a2=(int)s[i]-48; a=a1*10+a2; t++; } elseif(s[i]<48&&s[i]>39&&s[i]! =44&&s[i]! =46){ if(t==1){ bl=0; insert_sq(&p,a1,bl); t=0; } elseif(t==2){ bl=0; insert_sq(&p,a,bl); t=0; } bl=1; ch=(int)s[i]; insert_sq(&p,ch,bl); t=0; } else{ printf("%c不是有效的运算符! \n",s[i]); } }//endfor i=strlen(s)-1; if(s[i]>47&&s[i]<58){ if(s[i-1]>47&&s[i-1]<58){ bl=0; insert_sq(&p,a,bl); } else{ bl=0; insert_sq(&p,a1,bl); } } bl=1; a=35; insert_sq(&p,a,bl); return(check(*l)); } intOperate(inta,inttheta,intb){//计算 switch(theta){ case43: returna+b; case45: returna-b; case42: returna*b; case47: { if(b==0){ return-2000; } if(a%b==0){ returna/b; } else{//printf("不能为小数\n"); return-10000; } } default: return0; } } intReturnOpOrd(charop,char*TestOp)//precede()函数调用求优先级 { inti; for(i=0;i { if(op==TestOp[i])returni; } return0; } charprecede(charAop,charBop) { returnPrior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)]; } intinitstack(sqstack*s) { (s)->base=(int*)malloc(STACK_INIF_SIZE*sizeof(int)); if((s)->base==NULL)exit(-2); (s)->top=(s)->base; (s)->stacksize=STACK_INIF_SIZE; return1; } intgettop(sqstack*s){//取得栈顶元素 inte; if(s->top==s->base){ printf("栈空,无法取得栈顶元素! \n"); return0; } e=*(s->top-1); returne; } intpush(sqstack*s,inte){//压栈 if(s->top-s->base>=s->stacksize) { s->base=(int*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(int)); if(! s->base)exit(-2); s->stacksize+=STACKINCREMENT; } *(s->top++)=e; return1; } intpop(sqstack*s,int*e){//出栈 if(s->top==s->base) { printf("栈空,出栈错误! \n"); return0; } *e=*(--s->top); return1; } intEvaluateExpression(char*MyExpression){//算法3.4----计算表达式的值 //算术表达式求值的算符优先算法。 //设OPTR和&&OPND分别为运算符栈和运算数栈 intresult; sqstackOPTR;//运算符栈,字符元素 sqstackOPND;//运算数栈,实数元素 intc,bl,a,b,theta,top; sqlist*q,l; char*s=MyExpression; init_sq(&l); if(chang(s,&l)! =0){ q=&l; initstack(&OPTR); push(&OPTR,35); initstack(&OPND); q=q->next; c=q->num_ch; bl=q->bol; while((c! =35||gettop(&OPTR)! =35)){ if(bl! =1){ push(&OPND,c); q=q->next; c=q->num_ch; bl=q->bol; }//不是运算符则进栈 else{ top=gettop(&OPTR); switch(precede((char)top,(char)c)){ case'<': //栈顶元素优先权低 push(&OPTR,c); q=q->next; c=q->num_ch; bl=q->bol; break; case'=': //脱括号并接收下一字符 pop(&OPTR,&c); q=q->next; c=q->num_ch; bl=q->bol; break; case'>': //退栈并将运算结果入栈 pop(&OPTR,&theta); pop(&OPND,&b); pop(&OPND,&a); push(&OPND,Operate(a,theta,b)); break; default: printf("没有这个运算符! \n"); return0; }//switch }//else }//while result=gettop(&OPND); returnresult; } else{ printf("你的输入有错误! \n"); return0; } } intrandomm()//产生四个随机数 { inti=0; srand((unsigned)time(NULL)); for(;i<4;i++){ number[0][i]=0; number[0][i]=rand(); number[0][i]%=13; number[0][i]++; number[1][i]=0; } returnnumber[2][4]; } intCalcOneExpress(intexpression[][2])//计算表达式 { //算术表达式求值的算符优先算法。 //设OPTR和&&OPND分别为运算符栈和运算数栈,OP为运算符集合。 intindex=0,result,c,theta,a,b; sqstackOPTR;//运算符栈,字符元素 sqstackOPND;//运算数栈,实数元素 initstack(&OPTR); push(&OPTR,35); initstack(&OPND); c=expression[index][0]; while(c! =35||gettop(&OPTR)! =35) { if(expression[index][1]! =1) { push(&OPND,c); index++; c=expression[index][0]; }//不是运算符则进栈 else { switch(precede((char)gettop(&OPTR),(char)c)) { case'<': //栈顶元素优先权低 push(&OPTR,c); index++; c=expression[index][0]; break; case'=': //脱括号并接收下一字符 pop(&OPTR,&c); index++; c=expression[index][0]; break; case'>': //退栈并将运算结果入栈 pop(&OPTR,&theta); pop(&OPND,&b); pop(&OPND,&a); push(&OPND,Operate(a,theta,b)); break; default: printf("没有这个运算符\n"); return0; }//switch }//else }//while result=gettop(&OPND); returnresult; } intEqual24(intn) { if(n==24){ return1; } else return0; } //括号的几种情况 //1无括号 //2(ab)cd同ab(cd),下省略 //3(abc)d //4(ab)(cd) //5((ab)c)d intCalcArray1(intiNumInput[2][4]) { //a*b*c*d7个字符 intexpression[8][2],ii,jj,kk; inti,j,k,l,dRes; for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(j==i) { continue; } for(k=0;k<4;k++) { if(k==i||k==j) { continue; } for(l=0;l<4;l++) { if(l==i||l==j||l==k) { continue; } expression[0][0]=iNumInput[0][i]; expression[2][0]=iNumInput[0][j]; expression[4][0]=iNumInput[0][k]; expression[6][0]=iNumInput[0][l]; expression[0][1]=eNumber; expression[2][1]=eNumber; expression[4][1]=eNumber; expression[6][1]=eNumber; for(ii=0;ii<4;ii++) { for(jj=0;jj<4;jj++) { for(kk=0;kk<4;kk++) { expression[1][0]=oper[ii]; expression[1][1]=eOperator; expression[3][0]=oper[jj]; expression[3][1]=eOperator; expression[5][0]=oper[kk]; expression[5][1]=eOperator; expression[7][0]=oper[6]; expression[7][1]=eOperator; dRes=CalcOneExpress(expression); if(Equal24(dRes)) { printf("可以这样运算: %d%c%d%c%d%c%d\n",expression[0][0],oper[ii],expression[2][0],oper[jj],expression[4][0],oper[kk],expression[6][0]); return1; } } } }//endofforoper } } } } return0; } intCalcArray2(intiNumInput[2][4]) { //(a*b)*c*d//9number intexpression[10][2]; intii,jj,i,j,k,l,kk; intdRes; for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(j==i) { continue; } for(k=0;k<4;k++) { if(k==i||k==j) { continue; } for(l=0;l<4;l++) { if(l==i||l==j||l==k) { continue; } expression[1][0]=iNumInput[0][i]; expression[3][0]=iNumInput[0][j]; expression[6][0]=iNumInput[0][k]; expression[8][0]=iNumInput[0][l]; expression[1][1]=eNumber; expression[3][1]=eNumber; expression[6][1]=eNumber; expression[8][1]=eNumber; for(ii=0;ii<4;ii++) { for(jj=0;jj<4;jj++) { for(kk=0;kk<4;kk++) { expression[0][0]=oper[4]; expression[0][1]=eOperator; expression[2][0]=oper[ii]; expression[2][1]=eOperator; expression[4][0]=oper[5]; expression[4][1]=eOperator; expression[5][0]=oper[jj]; expression[5][1]=eOperator; expression[7][0]=oper[kk]; expression[7][1]=eOperator; expression[9][0]=oper[6]; expression[9][1]=eOperator; dRes=CalcOneExpress(expression); if(Equal24(dRes)) { printf("可以这样运算: %c%d%c%d%c%c%d%c%d\n",oper[4],expression[1][0],oper[ii],expression[3][0],oper[5],oper[jj],expression[6][0],oper[kk],expression[8][0]); return1; } } } }//endofforoper } } } } return0; } intCalcArray3(intiNumInput[2][4]) { //(a*b*c)*d//9number intexpression[10][2]; intii,jj,i,j,k,l,kk; intdRes; for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(j==i) { continue; } for(k=0;k<4;k++) { if(k==i||k==j) { continue; } for(l=0;l<4;l++) { if(l==i||l==j||l==k
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 24 游戏 源代码