今天我们先介绍循环队列的实现和常见操作,然后介绍几个字符串处理函数。后面每篇文章都会介绍C库中的一些函数,因为多了解一些C库中的函数是非常重要的。
一、循环排队:
循环列表中的元素在内存中也是连续的。与最后一部分的非循环队列相比,当队列头删除数据元素时,前面的空间可以继续使用。那么如何实现循环队列呢?我们学过一个叫做模运算的运算,其中的运算符是%,比如z=x%y,z是x除以y得到的余数,它有一个特点,z的最大值只能是y-1,z的取值范围是0~y-1,所以我们可以利用这个性质来实现循环。
首先,我们将循环队列的结构定义如下:
循环队列结构
ElemT是由#define定义的宏,可以是整数、字符或结构类型。
1.循环队列初始化:
先看示意图:
循环队列初始化示意图
其实记忆并不是真的戒指,而是我们假设的,这就把问题说清楚了。首先,我们需要分配一个连续的内存作为队列,然后将头尾索引设置为0,得到如下初始化函数:
正在初始化循环队列
这个函数是按照上图写的。
2.添加元素:
首先,我们来看一下示意图:
添加元素图
这里有一个完整的判断。以后==前来判断显然是不合适的,因为队列为空时也是如此。如果队列已满,从上图可以看出,前面一定比read领先一个空格,但只要判断后置1等于前置?显然,如上图后方所示:后方1=(n-1) 1=n,不等于前方,但发现它们相对于初始空间长度(n)的模结果是相等的,所以如果循环队列已满,则可以通过(后方1)%n的值是否等于前方来判断队列是否已满,这样就得到元素相加的函数如下:
循环队列添加元素
从上面的分析我们知道,循环队列一次只能添加的数据取决于初始分配的内存空间的长度,但只要在添加时从头开始取元素,就可以永远回收,不会满。这很好,让你觉得空间是取之不尽用之不竭的,但这只是你的错觉。
3.删除数据元素:
我们先看示意图,如下:
删除数据示意图
我们可以看到,如果我们追到顶,那么队列就没有数据可拿,那么就会是空的,需要继续添加数据才能继续删除。因此,队列是否为空可以通过前面是否等于后面来确定。如果没有,我们将继续通过循环模来改变front的值,因此我们得到以下函数来删除读取的数据元素:
删除元素
这个分析就简单多了。上述三种队列各有优势,应根据实际需要选择。到目前为止,这是关于队列的简单介绍。
二、字符串处理功能:
1.stpcpy函数:
一般形式是:
char * strpcpy(char * dest,const char * s);
函数:将字符串复制到数组中。
参数:dest是目标数组,s是要复制的字符串。
这个函数是用字符串表示的
请注意,它不是标准函数。这个函数不能在VC 6.0中使用。但是可以使用Turbo2.0。
此函数返回指向目标数组的指针,例如:
char ch[100];
char * pc=ch
PC=strpcpy(PC,’ i lov
e you”);
printf(“%s”,pc);
你会发现输出控制台上并没有输出i love you,而是啥都没有,为什么是这样呢?因为pc指针指向改变了,并不是指向ch数组的首地址了,而是指向i love you后面的地址,因此jmdyd在次使用该函数时,之前的数据并不会被覆盖,因此你只有使用ch输出,或者给pc重新赋值。
2、strcpy函数:
其一般形式如下:
char *strcpy(char *dest,const char *s);
作用:将字符串赋值到数组。
参数:dest为目标字符数组,s为需要复制的字符串。
返回值:dest数组的首地址。
运行结果:i love you!
i like you!
可以看出该函数并不像上面那函数一样,当第二次调用时会覆盖掉之前的数据,这应当注意。
注意:目标字符数组要足够容纳,需要复制的字符串,否则程序会出现溢出异常,导致程序出错崩溃。
3、strlen函数:
其一般形式为:
int strlen(const char *s);
作用:计算字符串s的长度。
参数为要计算长度的字符串。
返回值:返回字符串s的长度。
范例:
运行结果10。
strlen函数是以’\0’为结束标志的,比如char ch[100],strlen(ch),它的值是不定的,还有如果ch[100]=”i love you”;strlen(ch),结果也是不定的,不同编译器运行的结果可能有所不同,要是编译器在’y’字符后立马添上一个’\0’,那么结果就是正确的,要是没有立马那么结果就是错误的,因为strlen只以’\0’字符作为标准,计算字符串的长度。
4、strlwr函数:
其一般形式:
char *strlwr(char *s)。
作用:将参数s转换为小写。
返回值:将转换后的s返回,是指向s的指针。
范例:
运行结果:i love you!
注意:strlwr函数它是只能操作字符数组的,不能操作字符串常量,也不能操作指针指向的字符串常量,如char *ch=”I LOVE YOU”;strlwr(ch),这句是错误的,因为看过我前面写过的文章的,要是留意,就会知道,字符串常量它是作为常量存储在静态存储区域的,因此不能被修改。
今天我们暂时就介绍到这里,明天会继续介绍一点数据结构知识已经一些库函数,毕竟每天积累一点也是好的,你们说是不是!