啊哈,算法自学记——3rd
队列:(先进先出FIFO)
小哈给了小哼一串加密过的数字,同时小哈也告诉了小哼解密规则。
规则是这样的:首先将第 1 个数删除,紧接着将第 2 个数放到这串数的尾,
再将第 3 个数删除并将第 4 个数放到这串数的末尾,再将第 5 个数删除……
直到剩下最后一个数,将最后一个数也删除。按照刚才删除的顺序,把这些删除的数连在一起就是小哈的 QQ 啦
我自己题都没看懂,简单来说就是,从头部取两位,把第一位删除,把第二位续到剩下的数的后面,然后!!!删除的数才是结果。。。
#include <stdio.h>
typedef struct queen
{
int data[101];
int head;
int tail;
};
int main(int argc, char const *argv[])
{
struct queen q;
q.head=0;
q.tail=0;
printf("Input 9 num:\r\n");
for (int i = 0; i < 9; i++)//录入9个数
{
scanf("%d",&q.data[q.tail]);
q.tail++;
}
while (q.head<q.tail)//当队列不为空
{
//打印队首
printf("%d",q.data[q.head]);//删除的才是需要的
q.head++;//这里删除第一位,这里已经是指向第二位了,只是为了把第二位放到tail+1位
//将新的队首的数放置队尾+1
q.data[q.tail]=q.data[q.head];//续数
q.tail++;//尾部下标+1,往后延
//再将队首出队
q.head++;//第二位已经用过了,这里把第二位删除
}
return 0;
}
栈(先进后出)
验证字符串是否是回文(例如:aha,123321)
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
char a[101],s[101];
int next,len,mid,top;
printf("Input a string:\r\n");
gets(a);//读取一个字符串
len =strlen(a);//读取字符串长度
mid=len/2-1;//字符串中点
top=0;//栈初始化
//将mid前面的字符串入栈
for (int i = 0; i <= mid; i++)
{
s[++top]=a[i];
}
if (len%2==0)//判断回文是偶数个字符还是奇数个字符
{
next=mid+1;
}
else
{
next=mid+2;
}
//开始匹配
for (int i = next; i < len; i++)
{
if (a[i]!=s[top])//a[i]是字符串从中点开始以后的字符,s[top]是栈自顶之下的字符
{
break;
}
top--;
}
if (top==0)//如果能一一匹配则是回文
{
printf("YES\r\n");
}
else
{
printf("NO\r\n");
}
return 0;
}
纸牌游戏——小猫钓鱼(俗称:接竹竿
游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。(这不就是接竹竿嘛,(▽))
假如游戏开始时,小哼手中有 6 张牌,顺序为 2 4 1 2 5 6,小哈手中也有 6 张牌,顺序为 3 1 3 5 6 4,最终谁会获胜呢?
#include <stdio.h>
#include <string.h>
//定义一个结构体
typedef struct queen
{
int data[101];
int head;
int tail;
};
typedef struct stack
{
int data[10];
int top;
};
int main(int argc, char const *argv[])
{
//定义两个结构体,代表两人手中的牌
struct queen q1,q2;
struct stack s;//定义一个栈,代表放在桌面的牌
int book[10];//用来比较是否能收牌
int i,t;
q1.head=0;
q1.tail=0;
q2.head=0;
q2.tail=0;
s.top=0;//栈初始化
for (int i = 0; i < 9; i++)//标记那些牌已经放在桌子上
{
book[i]=0;
}
//首先加载两人手中的牌
printf("Input six num for q1:\r\n");
for (int i = 0; i < 6; i++)//每人只有六张牌
{
scanf("%d",&q1.data[q1.tail]);
q1.tail++;
}
printf("Input six num for q2:\r\n");
for (int i = 0; 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];//q1先出牌了
//判断是否能收牌
if (book[t]==0)//不能赢牌;类似于桶排序中的检测方法,如果=0那肯定是没有出现过t
{
q1.head++;//把q1打出的牌出队,删掉
s.top++;
s.data[s.top]=t;//把打出的牌入栈,也就是放到桌面上
book[t]=1;//标记桌面上有t这张牌
}
else//可以收牌
{
q1.head++;//把q1打出的牌出队,删掉
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];//q2出牌了
//判断是否能收牌
if (book[t]==0)//不能赢牌;类似于桶排序中的检测方法,如果=0那肯定是没有出现过t
{
q2.head++;//把q2打出的牌出队,删掉
s.top++;
s.data[s.top]=t;//把打出的牌入栈,也就是放到桌面上
book[t]=1;//标记桌面上有t这张牌
}
else//可以收牌
{
q2.head++;//把q2打出的牌出队,删掉
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 (q1.head==q1.tail)//q1木牌了,输了
{
printf("Q2 Win \r\n");
printf("Q2 have :\r\n");
for (int i = q2.head; i < q2.tail; i++)
{
printf("--%d",q2.data[i]);
}
if (s.top>0)//桌上还有牌
{
printf("\nDesktop have:\n");
for (int i = 1; i <= s.top; i++)
{
printf(" %d",s.data[i]);
}
}
else
{
printf("No puke\rn");
}
}
else if(q2.head==q2.tail)
{
printf("Q1 Win \r\n");
printf("Q1 have :\r\n");
for (int i = q1.head; i < q1.tail; i++)
{
printf("--%d",q1.data[i]);
}
if (s.top>0)//桌上还有牌
{
printf("\nDesktop have:\n");
for (int i = 1; i <= s.top; i++)
{
printf(" %d",s.data[i]);
}
}
else
{
printf("No puke\rn");
}
}
return 0;
}