队列是由头和尾来控制的
栈是由栈顶控制的
先进先出
例题:
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;
}