队列:
生活中的例子:
①买火车票的排队顺序
②打客服电话的顺序…
遵循的原则:先进先出。
(只允许在队列的首部i进行删除操作,这称为“出队”,在队列的尾部j进行插入操作,这称为“入队”。而队列没有元素即i==j,称为空队列,这个时候需要结束循环)
基本元素:一个数组,俩个变量。
例题:解密QQ号
解密规则:首先将第1个数删除,紧接着将第2个数放在这串数的末尾,再将第3个数删除并将第4个数放在这串数的末尾,再将第5个数删除…直到剩下最后一个数,将最后一个数也删除。按照刚才删除 的顺序,把这些删除的数连在一起就是解密后的QQ号。
源码:
#include<stdio.h>//解密QQ号
int main()
{
int a[100]={2,2,8,1,0,4,9,3,9,6}; //首先将一个数组 初始化(数组大小应该大一些,因为会把一些数移到这串数的后面)
int i=0,j=10; //i表示第一位,j表示最后一位的下一个数(用来存放后移的数),
while(i<j) //循环条件:i与j之间 具有“有效数字”即:直到剩一个数字a【i】==a【j】时结束循环。
{
printf("%d",a[i]);
i++; //删除一个数就i++,移到后一个数
a[j]=a[i]; //新增的数放在a【j】(为什么数组内存需要大一些)
i++; //然后i,j继续后移
j++;
}
return 0;
}
栈:
生活例子:
①手枪装子弹,最后装的先发射
②一个死胡同停车,最后停的需要先开出来
遵循原则:后进先出。
(仅允许在表的一端进行插入和删除运算)
基本元素:一个数组,一个元素。
例题:判断回文字符串
回文字符串:是指正读反读均相同的字符序列。例如:“席主席”,“记书记”,“aha”,“ahaha”…
源码:
#include<stdio.h>//回文判断
#include<string.h>
int main()
{
char a[101],s[101];
int len,i,mid,next,x=0;
printf("请输入一个字符串:");
gets(a);
len=strlen(a); //利用函数得到字符串的 长度len
mid=len/2-1; //我们可以发现回文字符串 是中心对称的 “ahaha”
//所以我们要得出中心点的位置, 利用栈 (先进后出)的特点,
for(i=0;i<=mid;i++) //将中心位置前的字符串存入一个新的数组中 (入栈)
{
x++; //★入栈
s[x]=a[i];/*s[++x]=a[i];*///这里++x :前置自增运算符 定义:先执行i自增1,再使用i的值参与计算
} // x++ :后置自增运算符 定义:先使用i的初值参与运算,然后执行i自增1
if(len%2==0) // 判断字符串长度的奇偶性,
next=mid+1; //如果是偶数位: 则中心位下一位:next=mid+1;
else
next=mid+2; //如果是奇数位: 则中心位下二位:next=mid+2; (为什么+1? mid+1==中心位)
for(i=next;i<=len-1;i++) //从中心位开始循环判断
{ //根据栈(先进后出 ,后进先出)
if(a[i]!=s[x]) //判断中心位后面的字符串与栈里的是否相等
break;
else
x--;
}
if(x==0) //如果栈里的x 循环到0,则说明 a数组与s数组相等。
printf("YES!");
else
printf("NO!");
return 0;
}
注: