首页 > 其他分享 >数据结构:“小猫钓鱼游戏”

数据结构:“小猫钓鱼游戏”

时间:2024-10-27 14:48:16浏览次数:9  
标签:小猫 钓鱼 top next 玩家 front 数据结构 void rear

一:题目

栈和队列的综合应用:“小猫钓鱼”的游戏规则是:将一副扑克牌平均分成两份,每人拿一份。玩家甲先拿出手中的第一张扑克牌放在桌上,然后玩家乙也拿出手中的第一张扑克牌,并放在玩家甲刚打出的扑克牌的上面,就像这样两个玩家交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一个人手中的牌全部出完时,游戏结束,对手获胜。

要求编写程序来模拟这场游戏,并判断出谁最后获胜,获胜的同时打印出获胜者手中的牌以及桌上可能剩余的牌。(应用性设计内容)

为了简化实现,先做这样一个约定,玩家甲和乙手中牌的牌面值只有1-9。

测试样例(测试样例均采用输入前规定当前发牌数量的方式)

序号

输入

输出

1

请输入发牌数:6

玩家甲:2 4 1 2 5 6

玩家乙:3 1 3 5 6 4

游戏结束:玩家乙赢

玩家乙手中牌为:6 5 2 3 4 1

桌面上还有牌为:3 4 5 6 2 1

2

请输入发牌数:8

玩家甲:5 4 1 3 7 9 6 2

玩家乙:6 2 4 8 5 7 1 3

游戏结束:玩家乙赢

玩家乙手中牌为:4  1  2  4  5  7  8  3  6  5

桌面上还有牌为:9  7  6  1  2  3

3

请输入发牌数:9

玩家甲:3 4 5 6 2 1 8 7 9

玩家乙:6 5 2 3 4 1 9 7 8

游戏结束:玩家甲赢

玩家乙手中牌为:2  1  6  3  4  2  9  8  9  5  6  3  7  5

桌面上还有牌为:1  4  8  7

二:思想

1.玩家手中的牌可看成队列,桌上牌看成栈。

2.判断是否和桌上牌某张相同时,可用遍历,或设个buff数组,用下标代表牌,值代表在不在

 1代表在,0代表不在。如buff【1】=1,表示牌面为1的牌已经存在,需相关操作。

3.其他就是出栈入栈出队入队

三:代码

new可替换malloc delete替代free

#include<iostream>
using namespace std;
int buff[10] = { 0 };

typedef int  QElemType;
typedef struct QNode
{
	QElemType data;
	struct QNode* next;
}QNode, * QueuePtr;
typedef struct
{
	QueuePtr front;
	QueuePtr rear;
}LinkQueue;
void initQueue(LinkQueue& q)
{
	q.front = new QNode;
	q.front->next = nullptr;
	q.rear = q.front;

}
void pushQueue(LinkQueue& q, QElemType x)
{
	QueuePtr p = new QNode;
	p->data = x;
	p->next = nullptr;
	q.rear->next = p;
	q.rear = p;

}
void popQueue(LinkQueue& q, QElemType& e)
{
	e = 0;
	QueuePtr p;
	if (q.rear == q.front) {
		 return;
	}
	p = q.front->next;
	e = p->data;
	q.front->next = p->next;
	if (p == q.rear)
		q.rear = q.front;
	delete p;

}
bool emptyQueue(LinkQueue& q)
{
	return q.front == q.rear;
}
QElemType gettopQueue(LinkQueue& q)
{
	if (emptyQueue(q)) {
		 return -1;
	}
	else return  q.front->next->data;
}
void clearQueue(LinkQueue& q)
{
	while (q.front->next)
	{
		QueuePtr p = q.front->next;
		q.front->next = p->next;
		delete p;
	}
	q.rear = q.front;
}
void destroyQueue(LinkQueue& q)
{
	while (q.front)
	{
		q.rear = q.front->next;
		delete q.front;
		q.front = q.rear;

	}
}
void displayQueue(LinkQueue& q)
{
	if (emptyQueue(q)) {  return; }
	QueuePtr  p = q.front->next;

	while (p)
	{
		cout << p->data; cout << " ";
		p = p->next;
	}
}
/// <summary>
/// /
/// </summary>

typedef int SElemType;
#define minsize 100
typedef struct
{
	SElemType* base;
	SElemType* top;
	int stacksize;
}SqStack;
void initStack(SqStack& s)
{
	s.base = new SElemType[minsize];
	s.top = s.base;
	s.stacksize = minsize;
}
void pushStack(SqStack& s, SElemType x)
{
	if (s.top - s.base == s.stacksize) {
		SElemType* tmp = new SElemType[100];
		int i = 0;
		while (s.base != s.top) {
			tmp[i] = *s.top; i++;
			s.top++;
		}
		s.base = tmp;
	}
	*s.top = x;
	s.top++;
}
bool emptyStack(SqStack& s)
{
	return s.base == s.top;
}
void popStack(SqStack& s, SElemType& e)
{
	if (emptyStack(s)) {

	return;
	}
	e = *(s.top - 1);
	s.top--;

}
void gettopStack(SqStack& s, SElemType& e)
{

	if (emptyStack(s)) {

		 return;
	}
	e = *(s.top - 1);

}
void clearStack(SqStack& s)
{
	SElemType e;
	while (!emptyStack(s))
	{
		popStack(s, e);
	}
}
void destroyStack(SqStack& s)
{
	delete[] s.base;
	s.base = s.top = nullptr;
	s.stacksize = 0;
}
void displayStack(SqStack S)
//输出顺序栈S中所有元素的值,顺序为从栈底到栈顶
{
	SElemType* p;
	if (S.base == S.top)               //如果栈空
	{
		printf("The Stack is NULL\n");
		return;
	}
	
	for (p = S.base; p < S.top; p++)
		cout << *p;
	cout << endl;

}
void add(LinkQueue& q,SqStack& s,int e)
{
	pushQueue(q, e);
	int f;
	while (1)
	{
		gettopStack(s, f);
		if (f == e) { pushQueue(q, e); popStack(s, f); buff[f] = 0; break; }
		pushQueue(q, f); popStack(s, f); buff[f] = 0;
	}
}
int main()
{
	LinkQueue q1, q2; initQueue(q1); initQueue(q2);
	cout << "请输入发牌数:";
	int n; 
	cin >> n; int i = 0, j = 0,k=0;
	cout << "请给玩家甲发牌:";
	while (i != n)
	{
		QueuePtr p = new QNode;
		cin >> p->data;
		pushQueue(q1, p->data); i++;
	}
	cout << "请给玩家乙发牌:";
	while (j != n)
	{
		QueuePtr p = new QNode;
		cin >> p->data;
		pushQueue(q2, p->data); j++;
	}
	cout << "游戏开始:" << endl;
	cout << "玩家甲手里的牌为" << endl;
	displayQueue(q1); cout  << endl;
	cout << "玩家乙手里的牌为" << endl;
	displayQueue(q2); cout << endl;
	SqStack s;
	initStack(s);
	int e, f;
	
	while (k != n)
	{
		if (emptyQueue(q1) || emptyQueue(q2)) break;
		popQueue(q1, e);

		if (buff[e] == 1) { add(q1, s, e); }
		else { buff[e] = 1; pushStack(s, e); }
		
		popQueue(q2, f);
		if (buff[f] == 1) { add(q2, s, f); }
		else {buff[f] = 1; pushStack(s, f);}
	}
	if (emptyQueue(q1))
	{
		cout << "游戏结束:玩家乙赢" << endl;
		cout << "玩家乙手里的牌为:"; displayQueue(q2);
		cout << "桌面上还有牌为:"; displayStack(s);
	}
	else
	{
		cout << "游戏结束:玩家甲赢" << endl;
		cout << "玩家甲手里的牌为:"; displayQueue(q1);
		cout << "桌面上还有牌为:"; displayStack(s);
	}
	return 0;
}

四:运行结果

标签:小猫,钓鱼,top,next,玩家,front,数据结构,void,rear
From: https://blog.csdn.net/lxy2977262881/article/details/143268860

相关文章

  • 数据结构~红黑树
    文章目录一、红黑树的概念二、红黑树的定义三、红黑树的插入四、红黑树的平衡五、红黑树的验证六、红黑树的删除七、完整代码八、总结一、红黑树的概念红黑树是一棵二叉搜索树,他的每个结点增加⼀个存储位来表示结点的颜色,可以是红色或者黑色。通过对任何⼀条从根到......
  • 数据结构与算法——Java实现 46. 从前序与中序遍历序列构造二叉树
    努力的意义大概就是当好运来临的时候你觉得你值得                                                ——24.10.24105.从前序与中序遍历序列构造二叉树给定两个整数数组 preorder 和 inorder ,其中 preorder 是......
  • 重生之“我打数据结构,真的假的?”--3.栈和队列(无习题)
    栈和队列C语言中的栈和队列总结在C语言中,**栈(Stack)和队列(Queue)**是两种非常重要的数据结构。它们广泛用于各种应用中,比如内存管理、任务调度、表达式求值等。本文将对这两种数据结构进行详细的介绍,并展示如何在C语言中实现它们。1.栈(Stack)栈是一种先进后出(LIFO,LastIn......
  • 利用社会工程学制作一个钓鱼网站
    目录使用社会工程学制作一个钓鱼网站setoolkit工具使用社会工程学制作一个钓鱼网站setoolkit工具setoolkit需要在root权限下运行sudosu#setoolkit1)Social-negineeringAttacks,直接输入1即可2)WebsiteAttackVectors3)CredentialHarvesterAttac......
  • 数据结构入门之复杂度
    前言:终于来到了数据结构。要想学好数据结构,首先就要了解数据结构的复杂度。那么,什么是复杂度呢?1数据结构所谓数据结构(DataStructure)就是计算机存储,组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。算法(Algorithm):就是定义良好的计算过程,它取一个或一......
  • 数据结构:(OJ917)仅仅反转字母
    给你一个字符串 s ,根据下述规则反转字符串:所有非英文字母保留在原有位置。所有英文字母(小写或大写)位置反转。返回反转后的 s 。示例1:输入:s="ab-cd"输出:"dc-ba"示例2:输入:s="a-bC-dEf-ghIj"输出:"j-Ih-gfE-dCba"示例3:输入:s="Test1ng-Leet=code-Q!"输出:"......
  • 数据结构之队列
    一、队列的定义队列是一种操作受限的线性表,队列只允许在表的一端进行插入,在表的另一端进行删除。可进行插入的一段称为队尾,可进行删除的一端称为队头。队列的主要特点就是先进先出。依照存储结构可分为:顺序队和链式队。二、顺序队列一开始front(队头)和rear(队尾)都在数......
  • 【数据结构】树-二叉树-堆(上)
    ......
  • 数据结构与算法——顺序栈的实现
    数据结构栈——一列数据,表尾入栈,表尾出栈,类似于子弹弹匣,压入子弹和拿出子弹都是从最上方进出。结构体structStack{ int*arr; intcapacity;//数组容量 inttop;//存储栈顶元素的下标};初始化栈intInitStack(structStack*stack){ stack->arr=......
  • 初阶数据结构之顺序表的实现
    1线性表什么是线性表呢?线性表是n个具有相同特性的数据元素的有限序列。常见的线性表:顺序表,链表,栈,队列,字符串。线性表在逻辑上是线性结构,在物理结构上不一定是线性的。线性表在物理存储时,通常是以数组或链式结构形式存储。线性表大致分为两种:顺序表和链表。基于这两种......