您的位置:首页 > 其它

队列和栈的综合案例

2018-01-10 09:05 99 查看

1、需求

现在有小明和小红两个人,他们在玩一个打牌游戏,规则是这样的:每个人6张牌,每人每次打出一张牌放在桌子上,如果哪次打出的牌跟桌子上的牌相同,则把这之间相同的牌收回放到自己牌的末尾。谁的牌先打完,代表谁先输。前提是我们的牌只有1-9这9张。

2、分析

两个人的牌,我们用两个队列表示,打牌就是出队,赢牌收到自己手中就是入队。打出的牌放在桌子上我们用一个栈表示,用一个数组记录桌子上已经有的牌。

3、代码

      3.1 定义队列和栈

struct queue
{
int data[1000];
int head;
int tail;
};

struct stack
{
int data[10];
int top;
};

      3.2 定义队列和栈、数组、变量

struct queue q1,q2;
struct stack s;
int book[10];
/*因为只有12张牌,每个人的牌都是1-9之中的数组,不可能桌子上的牌的数量大于10,所以定义一个长度10的数组来记录正好。*/
int i,t;

      3.3初始化队列和栈及标记桌子上牌的数组 

//初始化队列和栈
q1.head=1,q1.tail=1;
q2.head=1,q2.tail=1;
s.top=0;
//初始化用来标记哪些排在桌子上的数组
for(i=1;i<=9;i++){
book[i]=0;
}

     3.4分发牌给小明和小红

for(i=1;i<=6;i++){
scanf("%d",&q1.data[q1.tail]);
//每次插入一个数组后,队尾往后挪一位
q1.tail++;
}

for(i=1;i<=6;i++){
scanf("%d",&q2.data[q2.tail]);
q2.tail++;
}

     3.5判断是否能赢牌的关键代码

t=q1.data[q1.head];//小明先一张牌
//判断小明当前打出的额牌是否能赢牌
if(book[t]==0){//记录桌子上的牌数组中没有与打出的牌相同,代表没有赢
q1.head++;//打出了一张牌,要出队
s.top++;//栈顶向上移一位
s.data[s.top]=t;//
book[t]=1;
}else{
//假如可以赢牌
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--;
}
//收回桌子上牌面为t的牌
book[s.data[s.top]] =0;
q1.data[q1.tail]=s.data[s.top];
q1.tail++;
s.top--;
}

         3.6完整代码

#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

struct queue { int data[1000]; int head; int tail; }; struct stack { int data[10]; int top; };

int main(int argc, char *argv[]) {
struct queue q1,q2;
struct stack s;
int book[10];
int i,t;
//初始化队列和栈
q1.head=1,q1.tail=1;
q2.head=1,q2.tail=1;
s.top=0;
//初始化用来标记哪些排在桌子上的数组
for(i=1;i<=9;i++){
book[i]=0;
}

//依次向队列插入6个数(代表初始化两个人手中的牌)
printf("请输入小明手中的牌:\n");
for(i=1;i<=6;i++){
scanf("%d",&q1.data[q1.tail]);
q1.tail++;
}
printf("\n***********小明手中的牌输入完毕***********\n");
printf("请输入小红手中的牌:\n");
for(i=1;i<=6;i++){
scanf("%d",&q2.data[q2.tail]);
q2.tail++;
}
printf("\n**********************\n");
//当队列不为空时循环(即两人手中牌不为空的时候)
while(q1.head<q1.tail&&q2.head<q2.tail){
t=q1.data[q1.head];//小明先一张牌
//判断小明当前打出的额牌是否能赢牌
if(book[t]==0){//表明小明没有赢牌
q1.head++;//打出了一张牌,要出队
s.top++;
s.data[s.top]=t;
book[t]=1;
}else{
//假如可以赢牌
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--;
}
//收回桌子上牌面为t的牌
book[s.data[s.top]] =0;
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++;
w
8e40
hile(s.data[s.top]!=t){
book[s.data[s.top]]=0;
q2.data[q2.tail]=s.data[s.top];
q2.tail++;
s.top--;
}
//收回桌子上牌面为t的牌
book[s.data[s.top]]=0;
q2.data[q2.tail]=s.data[s.top];
q2.tail++;
s.top--;
}
}
if(q2.head==q2.tail){
printf("小明win\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("\n桌子上已经没有牌了。");
}
}else{
printf("小红win\n");
printf("小红当前手中的牌是:");
for(i=q2.head;i<=q2.tail-1;i++){
printf(" %d",q2.data[i]);
}
if(s.top>0){
printf("\n桌子上的牌是");
for(i=1;i<=s.top;i++){
printf(" %d",s.data[i]);
}
}else{
printf("\n桌子上已经没有牌了。");
}
}
getchar();getchar();
return 0;

}

       3.7 结果截图




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: