队列和栈及其应用.

队列和栈及其应用.

队列

队列可以视作"排队"的数字,从队首出队尾入.
此时我们创造一个队列.
int a[100] = {5,4,2,7,6,4,5,1,3}
如果要删掉数组头一个那么数字删去队首再将队中所有数据前进一格,但这样的做法很费时间.这就是队列存在的意义,怎么做呢?往下看.
我们用head,tail记录队首队尾.队尾=n(数组中数的数量)+1.为什么加一呢?因为头尾一旦重合会出现麻烦,所以队尾让他指向队尾的下一个数字.
int head =0 ,tali = 9;在这里插入图片描述
出队操作:
head++; \\浪费一个空间但是节省大量时间非常划算.
入队操作:
a[tail]=x;
tail++;
现在来创造一个队列
struct ch
{
int a[ 100 ];
int head;
int tail;
}

栈与队列相反,先进后出.可以理解为一个半径只能放进一个球的球框.后放进去的球拿的时候先拿
入栈
b[top] = x;
top++;
或者简写为
.b[top]++;
出栈
top–;
创造一个栈:
struct ru
{
int b[ 10 ];
int top;
}

用他们解决问题

现有俩个人甲乙玩小猫吃鱼的扑克游戏,小猫钓鱼游戏规则:一副牌52张牌(不用大小王)。当牌局开始时,每个玩家拥有大致相同数量的牌,然后轮流出牌,每人每次只出一张牌,从前到后排在桌上。

当此次出的牌值与桌面上的牌值有重复时,此次出牌的玩家将重复的牌以及中间间隔的牌拿走,插入手中牌的牌尾,注意,不得变动顺序。然后该玩家再出牌。每出一张牌为一轮。如果其中一个玩家手中没有牌,则为输,剩余人继续出牌,直至剩余一人,游戏结束。
现在甲有六张牌顺序为2,4,1,2,5,6,乙:3,1,3,5,6,4.规定手中只有1-9的牌面,请你写个程序判定谁赢.提示;桌面上的牌可以看做一个栈,手上牌可以看做一个队列.
在这里插入图片描述

代码实现

#include<stdio.h>
struct ch
{
int a[100];
int head;
int tail;
};
struct ru
{
int b[10];//因为只有九种牌面所以桌面最多九张牌.
int top;
};
struct ch q1,q2;//甲乙的牌组,全局变量定义数组自动初始化全0数组
int main()
{
int book[10]={0};//book用来标记桌面上有什么牌.
struct ch q1,q2;//甲乙的牌组.
q1.head=1;
q2.head=1;
q1.tail=1;
q2.tail=1;//初始化
struct ru w;//桌面上的牌.
w.top=0;
for(int i=0;i<6;i++){
scanf(“%d”,&q1.a[q1.tail]);
q1.tail++;//输入甲的牌组,用上述的入队方法.
}
for(int i=0;i<6;i++){
scanf(“%d”,&q2.a[q2.tail]);
q2.tail++;//输入乙的牌组
}
while(q1.tail!=q1.head&&q2.tail!=q2.head){//判断游戏有没有结束.
if(book[q1.a[q1.head]]==0){//甲先出牌判断是否可以收牌
w.top++;
w.b[w.top]=q1.a[q1.head];
book[q1.a[q1.head]]=1;//若没有则入栈并用数组book标记入栈的数字
}else{
q1.a[q1.tail]=q1.a[q1.head];
q1.tail++;
while(w.b[w.top]!=q1.a[q1.head]){
q1.a[q1.tail]=w.b[w.top];
q1.tail++;
book[w.b[w.top]]=0;//取消标记
w.top–;//入队出栈
}
q1.a[q1.tail]=w.b[w.top];
q1.tail++;
book[w.b[w.top]]=0;
w.top–;//最后一个数出栈入队
}
q1.head++;
if(book[q2.a[q2.head]]0){
w.top++;
w.b[w.top]=q2.a[q2.head];
book[q2.a[q2.head]]=1;
}else{
q2.a[q2.tail]=q2.a[q2.head];
q2.tail++;
while(w.b[w.top]!=q2.a[q2.head]){
q2.a[q2.tail]=w.b[w.top];
q2.tail++;
book[w.b[w.top]]=0;//取消标记
w.top–;//入队出栈
}
q2.a[q2.tail]=w.b[w.top];
q2.tail++;
book[w.b[w.top]]=0;
w.top–;//最后一个数入队出栈
}
q2.head++;
}
if(q1.tail
q1.head){
printf(“乙赢”);
}else{
printf(“甲赢”);
}
getchar();getchar();
return 0;
}

#include<stdio.h>
struct ch
{
	int a[100];
	int head;
	int tail;
};
struct ru
{
	int b[10];//因为只有九种牌面所以桌面最多九张牌.
	int top;
};	
struct ch q1,q2;//甲乙的牌组,全局变量定义数组自动初始化全0数组
int main()
{
	int book[10]={0};//book用来标记桌面上有什么牌.
	struct ch q1,q2;//甲乙的牌组.
	q1.head=1;
	q2.head=1;
	q1.tail=1;
	q2.tail=1;//初始化
	struct ru w;//桌面上的牌.
	w.top=0;
	for(int i=0;i<6;i++){
		scanf("%d",&q1.a[q1.tail]);
		q1.tail++;//输入甲的牌组,用上述的入队方法.
	}
	for(int i=0;i<6;i++){
		scanf("%d",&q2.a[q2.tail]);
		q2.tail++;//输入乙的牌组
	}
	while(q1.tail!=q1.head&&q2.tail!=q2.head){//判断游戏有没有结束.
		if(book[q1.a[q1.head]]==0){//甲先出牌判断是否可以收牌
				w.top++;
				w.b[w.top]=q1.a[q1.head];
		        book[q1.a[q1.head]]=1;//若没有则入栈并用数组book标记入栈的数字
		}else{
			q1.a[q1.tail]=q1.a[q1.head];
			q1.tail++;
			 while(w.b[w.top]!=q1.a[q1.head]){
			 	q1.a[q1.tail]=w.b[w.top];
				 q1.tail++;
			 	book[w.b[w.top]]=0;//取消标记
			 	w.top--;//入队出栈
			 }
			 q1.a[q1.tail]=w.b[w.top];
			 q1.tail++;
			 book[w.b[w.top]]=0;
			 w.top--;//最后一个数出栈入队
		}
		q1.head++;
			if(book[q2.a[q2.head]]==0){
			        w.top++;
					w.b[w.top]=q2.a[q2.head];
					book[q2.a[q2.head]]=1;
				}else{
					q2.a[q2.tail]=q2.a[q2.head];
								q2.tail++;
					 while(w.b[w.top]!=q2.a[q2.head]){
					 	q2.a[q2.tail]=w.b[w.top];
						q2.tail++;
					 	book[w.b[w.top]]=0;//取消标记
						w.top--;//入队出栈
					 }
					 q2.a[q2.tail]=w.b[w.top];
					 q2.tail++;
					 book[w.b[w.top]]=0;
					 w.top--;//最后一个数入队出栈
				}
				q2.head++;
	}
	if(q1.tail==q1.head){
		printf("乙赢");
	}else{
		printf("甲赢");
	}
	getchar();getchar();
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值