12月28日学习记录

  今天是阳了的第二天,本以为症状减轻,结果看了几页书之后又开始呕吐,呕吐完又吃东西补充体力,吃完再吐。。。

  今天勉强只看进去两三小节内容,还有一节应该算是题目和解题思路吧,那就先讲讲我今天所看的内容吧。分别是队列和栈。

  先讲队列问题,书上给的例题是拿QQ号举例子,但是我想到好像实验室有题差不多的,不过那题好像是插入一个数再进行n(用户输入)次排序(如果我没记错的话)。言归正题,队列是钟特殊的线性结构,我就拿解密QQ号来举例,xxx给出了 一串数字,把第一个数删除,接着讲第二个数放到末尾,再删第三个数。。。如此往复,直到删完所有的数,再将所有的书按照删除顺序排列就是xxx的QQ。

  首先想的肯定是定义一个数组对吧,可是会发现一个数组其实并不够用,因为删除后排列再删除,乍一看一个数列肯定没办法完全解决,首先想办法删除数据,初始化肯定不行,有一个很简单的方法就是将数组都往前挪动一位以此覆盖前一个数,所以所开的数组一定要比当前数的个数大,但是这种补空位的方法很费时间,要对每一个数进行挪位处理。于是我们可以用一个head去记录数列的第一个数,用tail记录记录最后一个数,但注意的是当head与tail重合时队列为空。

  还有一种方法是用结构体,但是由于我的结构体不是很熟徐,所以在这里就使用数列来求解。

#include <stdio.h>

int arr = {0,6,3,1,7,5,8,9,2,4};//这里我提前定义好了,可以用户自己输入,数组大小取决数字
int main()
{
    int tail = 10,head = 1;
    while(head < tail)//保证数组不为空队列
    {
        printf("%d",q[head]);
        head++;//删除数
        q[tail] = q[head];//将后一个数放至队尾
        tail++;//将队列第一个数出队
        head++;
    }
    return 0;
}

很简单的代码,对吧?(主要是今天头太痛了不想去思考。。。)

  接下来是栈,栈这个问题应该是acm社团讲课的时候有讲到过,但是由于那段时间实在苦于听不懂,再加上个人琐事令人心烦于是我就没有去听,现在后悔也是没有用的(希望看到这篇文章的人不要学我),书上给的栈的例题是解密回文,简而言之就是判断这个字符串是否从中间对称,要是在没看栈以前,我肯定是用两个字符串数组相比较,而且不一定写的出。在本书中对栈的描写也很简单易懂,如果我们要求回文数,那我们只需要从中间去判断两边是否相等就OK,这样只需要一个一维数组,然后加上一个指向顶部的变量,书上用的是top,那我也就使用top来写吧。首先我们得求该数列的中点,这时候就需要一堆东西,首先得要一个string.h的头文件,再要用strlen()去求长度,我们假定len是该字符串的长度,定义一个mid = len /2-1,接下来轮到栈出场啦:

for(int i = 0; i <= mid; i++)
{
    s[top] = arr[i];
    top++;
}

该题的关键步骤是将栈内的字符以依次拿出看是否能与mid后的字符一一匹配,如果能就是回文,不能就不是。

#include <stdio.h>
#include <string.h>

char arr[101],str[101];
int main()
{
    int i;
    scanf("%s",arr);//读入字符串
    int len = strlen(arr);//求字符长度
    int mid = len/2-1;//中点位置
    int top = 0;//对栈初始化
        //将mid前的数字开始入栈操作
    for(i = 0; i < mid; i++)
    {
        str[top] = arr[i];
        top++;
        //判断长度奇偶,并找出需要进行匹配的字符的起始下标
    }
    int next;
    if(len % 2 == 0)
    {
        next = mid + 1;
    }else{
        next = mid + 2;
    }//进行匹配

    for(i = next; i <= len - 1; i++)
    {
        if(arr[i] != str[top])
        break;
        top--;
    }//判断是否对应
    if(top == 0)
    printf("YES\n");
    else
    printf("NO\n");//结果
    return 0;
}

 其实今天还看了链表来着,无奈身体实在不舒服用指针的链表没看懂,模拟链表也不理解,今天就此作罢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值