队列基础算法

队列是由头和尾来控制的

栈是由栈顶控制的

先进先出

例题:

int main()//简单的解密

{
	int n = 9;//假如输入9个数
	int arr1[101] = {0,6,3,1,7,5,8,9,2,4};
	int* left = arr1 + 1;
	int* right = arr1 + n+1;

	//每执行一次就要先删除第一个数,把第二个数移动到最后面
	while (left != right+1)
	{
		left++;
		*right = *left;
		right++;
		left++;
	}
	//隔一个数打印
	int i = 1;
	while (arr1[i] != 0)
	{
		printf("%d ", arr1[i]);
		i = i + 2;
	}
	

	return 0;
}

解密回文栈(先进后出)

int main()
{
	char a[101] = { 0 };//haxah
	char s[101] = { 0 };//01234
	int top = 0;       //ha
	gets(a);
	int len = strlen(a);
	int mid = len / 2 - 1;//1
	for (int i = 0; i <= mid; i++)
	{
		s[++top] = a[i];// 先++ ,是因为如果后++那么top最后等于2,会执行下标为2 这个元素是 0 ,表示a
	}                   //
	int next = 0;

	if (len % 2 == 0)
	{
		next = mid + 1;
	}
	else
	{
		next = mid + 2;
	}
	//比较
	int i = 0;
	for(i = next; i <= len - 1;i++)
	{
		if (a[i] != s[top])
			break;
		top--;
	}
	if (top == 0)
	{
		printf("yes\n");
	}
	else
	{
		printf("NO\n");
	}
		return 0;
}

综合练习题,加强队列,栈,还有类似桶排序的概念

说明一些本题来自啊哈算法这不书

本人 通过读这本书,然后结合自己的理解做了的总结,如果描述不清楚可以查阅啊哈算法这本书

队列特性:先进先出,出队列由head控制,进队列由tail控制

栈特性:先进后出,出栈和入栈都由一个栈顶变量top来控制

桶:记录对应下标的数,是否进栈了

星期天小哼和小哈约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏——“小猫钓
鱼”。游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的
第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌
的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即
啊哈!算法
36
可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人
手中的牌全部出完时,游戏结束,对手获胜。

1.上面已经说过了队列的进出由两个变量来控制,所以创建一个结构体为一个数组,和两个变量;

2.上面说过了栈由一个变量来控制,所以创建一个结构体为一个数组,和一个变量;

栈里存放最多9个数;

3.先理清楚思路:

先给q1和q2分别给6张(1-9)的牌(也就是初始化);

然后

上面也说过了进队列由tail来控制,注意一下

初始化完以后

游戏开始,q1出牌,先把q1的第一张牌放到t里放着,通过book来判断,栈区有没有和t相同的数,如果没有这放t放入栈里,head++证明第一张牌出队列了,top++入栈一个数,虽然第一张牌的数还在原来的位置,但是在这里是由head和tail控制范围,所以先第一张相当于不见了。

如果book!=0,那么就证明栈里有相同的数,

需要 从栈里找 从顶到与t相同的数,依次放入

q1的队列里,所以 就 有top–;tail++;

每次出栈的数,都要用book来记录,book[t]==0表示这个数出栈了,book[t]==1说明这数在栈里。

q1和q2是一样的步骤,

最后就

判断q1没牌还是q2没牌了

当没牌了head=tail;

说明牌已经出光光了;

谁没牌谁就输了;

具体代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>	
struct queue {
	int data[1000];
	int head;
	int tail;
};
struct stack {
	int data[10];
	int top;
};

int main()
{
	int i;
	int t; 
	struct queue q1;
	struct queue q2;
	struct stack s;
	int book[10];
	q1.head = 1; q1.tail = 1;
	q2.head = 1; q2.tail = 1;
	s.top = 0;
// book 用来那个牌面进入了栈

	for (i = 1; i <= 9; i++)
	{
		book[i] = 0;

	}
	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++;
	}
	// 初始化完毕
// 游戏正式开始

	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
		{
			// book 找到了相同的牌,所以赢牌了,
			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 = q2.data[q2.head];
		if (book[t] == 0)
		{
			//没那个数,所以要把牌放到栈里
			q2.head++;
			s.top++;
			s.data[s.top] = t;
			book[t] = 1;
		}
		else
		{
			// book 找到了相同的牌,所以赢牌了,
			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--;

			}
		}
	}
	if (q2.head == q2.tail)
	{
		printf("小哼赢了\n");


	}
	else
	{
		printf("小哈赢了\n");
	}
	

	return 0;

}

!= 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("小哼赢了\n");


}
else
{
	printf("小哈赢了\n");
}


return 0;

}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2023框框

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值