第1关:纸牌游戏-钓鱼

任务描述

本关任务:给定任意6张牌给甲、乙,设计一个程序判定“纸牌游戏-钓鱼”的胜者。

测试说明

平台会对你编写的代码进行测试:

测试输入:
2 4 1 2 5 6
3 1 3 5 6 4
预期输出:
甲:4,1,2,5,6,
乙:1,3,5,6,4,
栈:2,3,
甲:1,2,5,6,
乙:3,5,6,4,
栈:2,3,4,1,
甲:6,1,1,2,4,3,2,
乙:5,6,4,
栈:5,3,
甲:1,2,4,3,2,
乙:4,5,6,3,5,
栈:6,1,
甲:2,4,3,2,1,4,1,
乙:5,6,3,5,
栈:6,
甲:4,3,2,1,4,1,
乙:6,3,5,
栈:6,2,5,
甲:2,1,4,1,3,3,
乙:5,6,4,5,2,6,
栈:
甲:1,4,1,3,3,
乙:6,4,5,2,6,
栈:2,5,
甲:4,1,3,3,
乙:4,5,2,6,
栈:2,5,1,6,
甲:3,3,
乙:4,4,5,6,1,5,2,2,
栈:6,1,
甲:3,
乙:4,5,6,1,5,2,2,
栈:6,1,4,3,
甲:
乙:6,1,5,2,2,4,3,4,
栈:6,1,5,3,
甲:
乙:6,1,5,2,2,4,3,4,
栈:6,1,5,3,
乙获胜

输入说明
第一行输入甲手中的6张牌;
第二行输入乙手中的6张牌。

输出说明
甲先出牌,如果发现桌面上有跟刚才打出的牌的数字相同的牌,则把从相同的那张牌开始的全部牌按次序放在自己手里的牌的末尾,再继续出牌,当桌面上没有跟刚才打出的牌的数字相同的牌时,分三行输出甲手里的牌,乙手里的牌,桌上的牌;同理,轮到乙出牌后,分三行输出甲手里的牌,乙手里的牌,桌上的牌,直到有一方获胜。

代码如下

# include <stdio.h>
# include <stdlib.h>
# include <string.h>typedef  int  SElemType;
typedef  int  QElemType;# include "sqstack.h"
# include "sqqueue.h"void output(QElemType s);
void input(QElemType &s);
void outputS(SElemType s);
void inputS(SElemType &s);
int comp(SElemType a, SElemType b);
int LocateElem_Sq(SqStack L, SElemType e, int (*compare)(SElemType, SElemType)) ;int  main()
{SqQueue  q1,q2;            //定义二个队列,代表甲、乙手中的牌SqStack  s;                //定义一个栈,代表桌面上的牌int i,t,x,n;InitQueue(q1);InitQueue(q2);InitStack(s); for(i=1;i<=6;i++){scanf("%d",&t);EnQueue(q1,t);}for(i=1;i<=6;i++){scanf("%d",&t);EnQueue(q2,t);}// 请在这里补充代码,完成本关任务/********** Begin **********/ QElemType e,e1,e2;int i1,i2,*ix;while(!QueueEmpty(q1)&&!QueueEmpty(q2)){DeQueue(q1,e1);i1=LocateElem_Sq(s,e1,comp);Push(s,e1);while(i1>=0){ix=s.base+i1;while(ix<s.top){Pop(s,e);EnQueue(q1,e);}DeQueue(q1,e1);i1=LocateElem_Sq(s,e1,comp);Push(s,e1);}printf("甲:");QueueTraverse(q1,outputS);DeQueue(q2,e2);i2=LocateElem_Sq(s,e2,comp);Push(s,e2);while(i2>=0){ix=s.base+i2;while(ix<s.top){Pop(s,e);EnQueue(q2,e);}DeQueue(q2,e2);i2=LocateElem_Sq(s,e2,comp);Push(s,e2);}printf("乙:");QueueTraverse(q2,outputS);printf("栈:");StackTraverse(s,outputS);}if(QueueEmpty(q1))printf("乙获胜");elseprintf("甲获胜");/********** End **********/  return 0;
}int LocateElem_Sq(SqStack L, SElemType e, int (*compare)(SElemType, SElemType))
{  // 在顺序栈L中查找第1个值与e满足compare()的元素的位序。// 若找到,则返回其在L中的位序,否则返回0。int i;SElemType *p;i = 0;        // i的初值为第1个元素的位序p = L.base;   // p的初值为第1个元素的存储位置int length = L.top-L.base;while (i <length && !(*compare)(*p++, e)) ++i;if (i < length) return i;else return -1;
} // LocateElem_Sqvoid output(QElemType s)
{printf("%d,",s);
}void input(QElemType &s)
{   scanf("%d",&s);
}
void outputS(SElemType s)
{printf("%d,",s);
}void inputS(SElemType &s)
{   scanf("%d",&s);
}
int comp(SElemType a, SElemType b)
{if(a>b)return 0;elseif(a == b)return 1;elsereturn 0;
}

辅助文件

sqqueue.cpp

#include<stdio.h>
#include<stdlib.h>#include"sqqueue.h"
typedef  int  QElemType;
void InitQueue(SqQueue &Q){ Q.base=(QElemType *)malloc(MAX_QSIZE*sizeof(QElemType));if(!Q.base) // 存储分配失败exit(OVERFLOW);Q.front=Q.rear=0;}
// 销毁循环队列Q,Q不再存在void DestroyQueue(SqQueue &Q){ if(Q.base)free(Q.base);Q.base=NULL;Q.front=Q.rear=0;}
// 将Q清为空循环队列void ClearQueue(SqQueue &Q){ Q.front=Q.rear=0;}
// 若循环队列Q为空队列,则返回TRUE;否则返回FALSEint QueueEmpty(SqQueue Q){ if(Q.front==Q.rear) // 队列空的标志return TRUE;elsereturn FALSE;}
// 返回Q的元素个数,即循环队列的长度int QueueLength(SqQueue Q){ return(Q.rear-Q.front+MAX_QSIZE)%MAX_QSIZE;}
// 若循环队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERRORint GetHead(SqQueue Q,QElemType &e){ if(Q.front==Q.rear) // 队列空return ERROR;e=Q.base[Q.front];return OK;}
// 插入元素e为循环队列Q的新的队尾元素int EnQueue(SqQueue &Q,QElemType e){ if((Q.rear+1)%MAX_QSIZE==Q.front) // 队列满return ERROR;Q.base[Q.rear]=e;Q.rear=(Q.rear+1)%MAX_QSIZE;return OK;}
// 若循环队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERRORint DeQueue(SqQueue &Q,QElemType &e){ if(Q.front==Q.rear) // 队列空return ERROR;e=Q.base[Q.front];Q.front=(Q.front+1)%MAX_QSIZE;return OK;}
// 从队头到队尾依次对队列Q中每个元素调用函数vi()void QueueTraverse(SqQueue Q,void(*vi)(QElemType)){ int i;i=Q.front;while(i!=Q.rear){vi(Q.base[i]);i=(i+1)%MAX_QSIZE;}printf("\n");}

sqqueue.h

#ifndef   __SQQUEUE_H__
#define   __SQQUEUE_H__
#include"symbol.h"
#define MAX_QSIZE 20 // 最大队列长度+1typedef  int  QElemType;struct SqQueue
{QElemType *base; // 初始化的动态分配存储空间int front; // 头指针,若队列不空,指向队列头元素int rear; // 尾指针,若队列不空,指向队列尾元素的下一个位置
};
void InitQueue(SqQueue &Q);      // 构造一个空循环队列Q
void DestroyQueue(SqQueue &Q);   // 销毁循环队列Q,Q不再存在
void ClearQueue(SqQueue &Q);   // 将Q清为空循环队列
int QueueEmpty(SqQueue Q);     // 若循环队列Q为空队列,则返回TRUE;否则返回FALSE
int QueueLength(SqQueue Q);      // 返回Q的元素个数,即循环队列的长度
int GetHead(SqQueue Q,QElemType &e); // 若循环队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERROR
int EnQueue(SqQueue &Q,QElemType e);   // 插入元素e为循环队列Q的新的队尾元素
int DeQueue(SqQueue &Q,QElemType &e);  // 若循环队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
void QueueTraverse(SqQueue Q,void(*vi)(QElemType)); // 从队头到队尾依次对队列Q中每个元素调用函数vi()
#endif

sqstack.cpp

#include<stdio.h>
#include<stdlib.h>#include"sqstack.h"
typedef  int SElemType;
void InitStack(SqStack &S)
{ if(!(S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType))))exit(OVERFLOW); // 存储分配失败S.top=S.base;S.stacksize=STACK_INIT_SIZE;
}void DestroyStack(SqStack &S)
{ free(S.base);S.base=NULL;S.top=NULL;S.stacksize=0;
}void ClearStack(SqStack &S)
{ S.top=S.base;
}int StackEmpty(SqStack S)
{if(S.top==S.base)return TRUE;elsereturn FALSE;   }int StackLength(SqStack S)
{ return S.top-S.base;
}int GetTop(SqStack S,SElemType &e)
{ if(S.top>S.base){e=*(S.top-1);return OK;}elsereturn ERROR;}void Push(SqStack &S,SElemType e)
{ if(S.top-S.base>=S.stacksize) // 栈满,追加存储空间{S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));if(!S.base)exit(OVERFLOW); // 存储分配失败S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*(S.top)++=e;
}int Pop(SqStack &S,SElemType &e)
{ if(S.top==S.base)return ERROR;e=*--S.top;return OK;
}void StackTraverse(SqStack S,void(*visit)(SElemType))
{while(S.top>S.base)visit(*S.base++);printf("\n");
}

sqstack.h

#ifndef   __SQSTACK_H__
#define   __SQSTACK_H__#include"symbol.h"#define  STACK_INIT_SIZE   100  //存储空间初始分配量
#define  STACKINCREMENT    10   //存储空间分配增量  typedef  int SElemType;typedef   struct
{          SElemType     *base;    //栈的基址即栈底指针          SElemType     *top;     //栈顶指针          int      stacksize;       //当前分配的空间
}SqStack;
void InitStack(SqStack &S);    // 构造一个空栈S
void DestroyStack(SqStack &S); // 销毁栈S,S不再存在
void ClearStack(SqStack &S);   // 把S置为空栈
int StackEmpty(SqStack S);     // 若栈S为空栈,则返回TRUE,否则返回FALSE
int StackLength(SqStack S);    // 返回S的元素个数,即栈的长度
int GetTop(SqStack S,SElemType &e);  // 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
void Push(SqStack &S,SElemType e);    // 插入元素e为新的栈顶元素
int Pop(SqStack &S,SElemType &e);     // 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
void StackTraverse(SqStack S,void(*visit)(SElemType)); // 从栈底到栈顶依次对栈中每个元素调用函数visit()
#endif

symbol.h

#ifndef   __SYMBOL_H__
#define   __SYMBOL_H__#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1#endif

栈和队列的综合应用-钓鱼相关推荐

  1. java 栈队列区别是什么意思_java栈和队列的区别

    Java中用LinkedList实现栈和队列_IT/计算机_专业资料.笔记摘录 栈和队列是两种特殊的线性表,它们的逻辑结构和线性表相同,只是其运算规则 较线性表有更多的限制,故...... 闽江学院电 ...

  2. 八、【栈和队列】栈的应用

    栈的应用 栈具有先进后出的特点,这个特点在解决某些问题时是很有效的.本节我们来看几个栈的常见应用以及栈结构适合解决的问题类型. 1 数制转换 我们日常生活中用的是十进制,而计算机中绝大多数时候是二进制 ...

  3. Java数据结构(1.1):数据结构入门+线性表、算法时间复杂度与空间复杂度、线性表、顺序表、单双链表实现、Java线性表、栈、队列、Java栈与队列。

    数据结构与算法入门 问题1:为什么要学习数据结构          如果说学习语文的最终目的是写小说的话,那么能不能在识字.组词.造句后就直接写小说了,肯定是不行的, 中间还有一个必经的阶段:就是写作 ...

  4. 数据结构复习-基础、线性表、栈、队列、串

    数据结构复习笔记 作者: 收集于网络 第一章:概论 数据:指所有能被输入到计算机中,且能够被计算机识别.存储和加工处理的信息的载体,是计算机操作的对象的总称. 数据元素:数据的基本单位,有时一个数据元 ...

  5. 《大话数据结构》3、4、5线性表、栈与队列、串

    第3章线性表 41 线性表:零个或多个数据元素的有限序列. 3.1开场白 42 门外家长都挤在大门口与门里的小孩子的井然有序,形成了鲜明对比.哎,有时大人的所作所为,其实还不如孩子. 3.2线性表的定 ...

  6. C语言数据结构【手抄版】第三章 栈和队列

    注意:文中彩色代码均在Visual Studio 2022编译器中编写,本文为C语言数据结构手抄版,文中有部分改动,非原创. 目录 注意:文中彩色代码均在Visual Studio 2022编译器中编 ...

  7. 小猫钓鱼——(c++用栈和队列实现)

    参考书:啊哈算法 题目:星期天小哼和小哈约在一块玩桌游,他们正在玩一个非常古怪的扑克游戏--"小猫钓鱼"(类似小时候玩的丁沟钓鱼).游戏规则:将一副扑克牌平均分成两份,每人拿一份. ...

  8. 栈和队列在python中的实现

    栈和队列是两种基本的数据结构,同为容器类型,队列是先进先出,栈是先进后出. 栈 栈提供 push 和 pop 等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterat ...

  9. c++数据结构队列栈尸体_一本正经的聊数据结构(3):栈和队列

    前文传送门: 「一本正经的聊数据结构(1):时间复杂度」 「一本正经的聊数据结构(2):数组与向量」 引言 前一篇内容我们介绍了数组和向量,虽然说向量是数组的一个升级版,但是在另一个维度上,他们都属于 ...

最新文章

  1. 知乎算法团队负责人孙付伟:Graph Embedding在知乎的应用实践
  2. 如何更改linux文件目录拥有者及用户组
  3. 漏洞检测,流量和性能监控
  4. vim 语法高亮显示
  5. 实例3:按部门统计工资人数
  6. 如何在EXCEL中添加下拉框
  7. UITableView分页
  8. 中兴的自毁与自救:封杀7年、禁用 Android,76岁创始人奔走前线!
  9. 又有好奇心,又能自主学习,这个机器人棒棒哒!
  10. Matlab绘图设置总结
  11. Android实战经验之图像处理及特效处理的集锦
  12. 拓端tecdat|python研究汽车传感器数据统计可视化分析
  13. 电商直播系统源码该如何突破?
  14. Apple Final Cut Pro X 10.4.6 中文特别版 Mac 最强大视频后期制作软件
  15. Unity:骨骼动画
  16. 手机也可以快速翻译、PDF翻译超简单
  17. 音视频技术之《移动直播秒开优化经验》
  18. 计算机速录教程,亚伟中文速录机培训教程(60版).doc
  19. python report_ReportPortal(自动化报表统一平台)的搭建与python推送
  20. Bowtie2错误:Could not locate a Bowtie index corresponding to basename /home/s45/mouse

热门文章

  1. php获取中文城市首字母排序,PHP实现获取第一个中文首字母并进行排序的方法
  2. 符号引用和直接引用,解析和分派
  3. 仓库管理系统有哪些作用?选择仓库管理系统要注意这4大问题!
  4. AOS加性算子分裂法
  5. uc浏览器app点评
  6. 10秒开场打动客户!外贸电话营销攻略和话术请查收
  7. 创建获奖场景平面设计
  8. 数字IC-ME-STA
  9. 滴滴押注大文娱,能得到自己想要的答案吗?
  10. 笔记本键盘按键安装拆卸与安装详解