栈 | 队列 |
先进后出;如浏览网页需要退回到之前的网页时需要一步步退回 | 先进先出;如排队买东西,先到先走 |
需要一个一维数组和一个指向栈顶的变量top | 需要一个一维数组和两个变量head和tail |
一、队列的应用之解密
有一串数字,先将第1个数删除,紧接着第2个数放到这串数的末尾,再将第3个数删除并将第4个数放到末尾,再将第5个数删除......直到剩下最后一个数,将最后一个数也删除。按照刚才删除的顺序,把这些删除的数连在一起, 就是解密后的数字串
代码如下
#include<stdio.h>
struct queue
{
int data[100];//队列的主体,用来存储内容
int head;//队首
int tail;//队尾
};
int main()
{
struct queue q;
int i;
q.head = 1;
q.tail = 1;
for(i = 1; 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 ++;//将队首出队
q.data[q.tail] = q.data[q.head];//将新队首的数添加到队尾
q.tail ++;
q.head ++;//再将队首出队
}
return 0;
}
二、栈的应用之判断回文
如果一个字符串是回文,它必须是中间对称,需要中点
mid = len / 2 - 1
先将mid之前的字符串全部入栈,再将当前栈中的字符串依次出栈,看能否与mid之后的字符一一匹配,如果能就说明是回文字符串。
代码如下
#include<stdio.h>
#include<string.h>
int main()
{
char a[101], s[101];
int i, len, mid, next, top;
gets(a);//读入一行字符串
len = strlen(a);//求字符串的长度
mid = len / 2 - 1;//求字符串的中点
top = 0;//栈的初始化
for(i = 0; i <= mid; i ++)//mid之前的依次入栈
s[++top] = a[i];
//判断长度是奇数还是偶数,并找到需要进行字符匹配的起始下标
if(len % 2 == 0) next = mid + 1;
else next = mid + 2;
for(i = next; i <= len - 1; i ++)//开始匹配
{
if(a[i] != s[top])
break;
top --;
}
if(top == 0) printf("YES");
else printf("NO");
return 0;
}