栈和队列的简单应用---扑克游戏,游戏规则很简单,首先将一副扑克牌均分成两份给两个玩家(甲乙),让甲先出牌,然后让乙出牌,并把牌放在甲的打出的牌上方,两人交替出牌。出牌时,如果某个玩家打出的牌和桌上某张牌一样,就可以将这两张一样的牌及两张牌中间所夹得牌全部收走,并依次放在自己手中的牌的末尾。如果有一个玩家手中没有牌了,游戏结束,对方赢得游戏。
假设只有12张牌,甲乙各6张牌,牌面只有数字1到9,每个玩家都只有出牌和赢牌两种操作,出牌操作相当于出队,赢牌操作相当于入队,而桌子相当于一个栈,把牌打出放在桌上相当于入栈,从桌上拿走牌相当于出栈。手中先无牌者输,即该队列为空。
#include<stdio.h>
struct queue{
int data[100];
int head;
int tail;
};
struct stack{
int data[10];
int top;
};
//假设牌面只设有数字1-9
int main(){
struct queue q1,q2;
struct stack s;
int i,t;
int book[10];//记录桌上有哪些牌
//初始化队列
q1.head=q1.tail=1;
q2.head=q2.tail=1;
s.top=0;//初始化栈
for(i=1;i<=9;i++)
book[i]=0;//最初的时候桌面还没有牌
for(i=1;i<=6;i++){//读入6张牌,放在甲手中
scanf("%d",&q1.data[q1.tail]);
q1.tail++;
}
for(i=1;i<=6;i++){//读入6张牌,放在乙手中
scanf("%d",&q2.data[q2.tail]);
q2.tail++;
}
while(q1.head<q1.tail && q2.head<q2.tail){//队列不为空,表示此时游戏未结束
t=q1.data[q1.head];//甲先出一张牌
if(book[t]==0){//桌上没有和t一样的牌,此时甲不能赢
q1.head++;//打出的牌出队
s.top++;
s.data[s.top]=t;//把打出的牌放在桌上,入栈
book[t]=1;//桌上已有牌面为t的牌
}
else{//桌上有牌面为t的牌,此时甲能赢
q1.head++;//打出的牌出队
q1.data[q1.tail]=t;//将打出的牌放在手中牌的末尾
q1.tail++;
while(s.data[s.top]!=t){//将桌上赢得的牌依次放在手中牌的末尾
book[s.data[s.top]]=0;
q1.data[q1.tail]=s.data[s.top];
q1.tail++;
s.top--;//从桌上拿走牌,出栈
}
book[s.data[s.top]]=0;//拿走桌上牌面为t的牌放在手牌的末尾
q1.data[q1.tail]=s.data[s.top];
q1.tail++;
s.top--;
}
if(q1.head==q1.tail) break;
t=q2.data[q2.head];//乙出牌
if(book[t]==0){//此时乙不能赢
q2.head++;
s.top++;
s.data[s.top]=t;
book[t]=1;
}
else{
q2.head++;
q2.data[q2.tail]=t;
q2.tail++;
while(s.data[s.top]!=t){
book[s.data[s.top]]=0;
q2.data[q2.tail]=s.data[s.top];
q2.tail++;
s.top--;
}
book[s.data[s.top]]=0;
q2.data[q2.tail]=s.data[s.top];
q2.tail++;
s.top--;
}
}
if(q2.head==q2.tail){//乙手中没有牌,队列为空
printf("甲赢\n");
printf("甲手中的牌是:");
for(i=q1.head;i<=q1.tail-1;i++){
printf("%d ",q1.data[i]);
}
if(s.top>0){
printf("\n桌上剩下的牌是:");
for(i=1;i<=s.top;i++)
printf("%d ",s.data[i]);
}
else{
printf("桌上没有剩余的牌!");
}
}
else{
printf("乙赢\n");
printf("乙手中的牌是:");
for(i=q2.head;i<=q2.tail-1;i++){
printf("%d ",q2.data[i]);
}
if(s.top>0){
printf("桌上剩下的牌是:");
for(i=1;i<=s.top;i++)
printf("%d ",s.data[i]);
}
else{
printf("桌上没有剩余的牌!");
}
}
return 0;
}
利用了两个结构体,没有使用指针,定义了一个book数组来记录桌上有哪些牌,用到的方法和桶排序的方法是一样的,也可以枚举,利用for循环,试了很多组数据,没有错误,不过应该存在使循环不能退出的情况,也就是游戏不会结束,但是暂时没有找到这样两组数据。