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点
算法:
//判断用户给出的运算符结果是否正确
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;
}
}
}
}