24-1

24点游戏是经典的纸牌益智游戏。

常见游戏规则:

从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1)

由用户输入包含这4个数字或字母的运算表达式(可包含括号),如果表达式计算结果为24则代表用户赢了此局。

初始化 操作数栈和操作符栈

typedef struct{
 float elem[MAXSIZE];
 int top;
}OVS;//操作数栈
typedef struct{
 char elem[MAXSIZE];
 int top;
}OPS;//运算符栈

初始化栈

int iniOVS(OVS * s){//初始化操作数栈
 if((s==(OVS *)malloc(sizeof(OVS)))==NULL){
  return 0;
 }
 s->top=-1; 
 return 1;
}
int iniOPS(OPS * s){//初始化运算符栈
 if((s==(OPS *)malloc(sizeof(OPS)))==NULL){
  return 0;
 }
 s->top=0;
 s->elem[0]='#';
 return 1;
}

出栈操作

int PushOVS(OVS * o,float x){//入栈
 if(o->top==MAXSIZE-1){
  return 0;
 }else{
  o->top++;
  o->elem[o->top]=x;
  return 1;
 }
}
int PushOPS(OPS * o,char x){//入栈
 if(o->top==MAXSIZE-1){
  return 0;
 }else{
  o->top++;
  o->elem[o->top]=x;
  return 1;
 }
} 

入栈操作

int PopOVS(OVS* o,float *x){//出栈
 if(o->top==-1){
  return 0;
 }else{
  *x=o->elem[o->top];
  o->top--;
  return 1;
 }
} 
int PopOPS(OPS* o,char *x){//出栈
 if(o->top==-1){
  return 0;
 }else{
  *x=o->elem[o->top];
  o->top--;
  return 1;
 }
}

返回栈顶元素

float TopOVS(OVS * o){//返回栈顶元素但top不变
 if(o->top==-1){
  return 0;
 }else{
  return o->elem[o->top];
 }
} 
char TopOPS(OPS * o){//返回栈顶元素但top不变
 if(o->top==-1){
  return '\0';
 }else{
  return o->elem[o->top];
 }
}

判断用户输入的表达式运算结果是否为24点
算法:
24-1

//判断用户给出的运算符结果是否正确
int  Judge(OVS *ovs,OPS *ops, char *str){
 int i=0;
 char c;
 while(true){
  //当 当前字符为数字或字母A,J,K,Q,时将当前字母入操作数栈
  if(str[i]>='0'&&str[i]<='9'||str[i]=='J'||str[i]=='Q'||str[i]=='K'||str[i]=='A'){
   switch(str[i]){
   case 'J':PushOVS(ovs,11);break;
   case 'Q':PushOVS(ovs,12);break;
   case 'K':PushOVS(ovs,13);break;
   case 'A':PushOVS(ovs,1);break;
   case '1':PushOVS(ovs,10);i++;break;
   default:PushOVS(ovs,str[i]-'0');break;
   }
   i++;
  //当 当前字符为(或运算符优先级大于运算符栈栈顶元素时 当前字符入栈
  }else if(str[i]=='('||(oper[str[i]-'('] > oper[TopOPS(ops)-'('])){
   PushOPS(ops,str[i]);
   i++;
  //当 当前字符为)或运算符栈栈顶元素为(时 (字符出栈
  }else if(str[i]==')' && TopOPS(ops)=='('){
   PopOPS(ops,&c);
   i++;
  //当 当前字符为# 且运算符栈栈顶元素为#时 运算结束
  //通过判断操作数栈 栈顶元素判断玩家给出的表达式是否正确
  }else if(str[i]=='#'&&TopOPS(ops)=='#'){ 
   if(abs(TopOVS(ovs))==24.0){
    printf("               win         \n");
    return 1;
   }
   else{
    printf("               lose\n");
    return 0;
   }
  //当 当前字符为(或运算符优先级小于等于运算符栈栈顶元素时 进行计算
  //计算方式为 从操作数栈取出两个操作数 和从运算符栈取出的元素进行计算
  }else if(oper[str[i]-'('] <= oper[TopOPS(ops)-'(']){
   float a=0,b=0;
   char oper;
   PopOVS(ovs,&b);
   PopOVS(ovs,&a);
   PopOPS(ops,&oper);
   switch(oper){
   case '+':PushOVS(ovs,a+b);break;
   case '-':PushOVS(ovs,a-b);break;
   case '*':PushOVS(ovs,a*b);break;
   case '/':PushOVS(ovs,a/b);break;
   }
  }
 
 }
}