栈(判断回文)&队列(解密)的初级应用实例

队列
先进后出;如浏览网页需要退回到之前的网页时需要一步步退回 先进先出;如排队买东西,先到先走
需要一个一维数组和一个指向栈顶的变量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;
}

猜你喜欢

转载自blog.csdn.net/m0_74776728/article/details/130533933