队列
一、基本操作
1、构建队列
2、销毁队列
3、清空队列
4、队列长度
5、插入/删除队列
二、存储方式
1、顺序存储
typedef
{
QElemType *base;
int front;
int rear;
}Queue;
队列空的条件:q.front==q.rear
队列满的条件:(q.rear+1)%maxsize==(q.front)
1)入队
a、判断是否队满
b、将新元素插入队尾
c、队尾指针加1
2)队空
a、判断是否空
b、保存队头元素
c、队头指针加1
3)出队
a、先判断队列是否为空
b、保持队头元素
c、队头指针加1
2、链式存储
typedef struct Qnode
{
QElemtype data;
struct Qnode *next;
}Qnode;
typedef struct
{
Qnode * front; //队头指针
Qnode *rear; //队尾指针
} LinkQueue;
KMP算法
1、算法思路:
··通过对子串进行操作,减少匹配次数。通过预处理生成next数组,从而减少一些不必要的比较。
2、生成的next数组代码
1)
void getNext(char* pattern, int* next) {
int i = 0, j = -1;
next[0] = -1;
int len = strlen(pattern); //求出子串的长度
while (i < len) {
if (j == -1 || pattern[i] == pattern[j]) { //j==-1的话,字符不匹配,重新开始;
i++;
j++;
next[i] = j;
}
else {
j = next[j];
}
}
}
2)改进(可能出现子串有重复字符的情况,会导致next 数组进行多余的匹配,所以进行改进)
void getNext(char* pattern, int* next) {
int i = 0, j = -1;
next[0] = -1;
int len = strlen(pattern);//求出子串的长度
while (i < len) {
if (j == -1 || pattern[i] == pattern[j]) {//j==-1的话,字符不匹配,重新开始;
i++;
j++;
if(pattern[i]==pattern[j])//解决子串中多个字符相同的情况,减少重复不符合然后重复调用next[j]
next[i]=next[j];
else
next[i]=j;
}
else {
j = next[j];
}
}
}
3、KMP算法代码部分
int kmp(char *s, char *p, int next[]) {
int i = 0, j = 0, s_len = strlen(s), p_len = strlen(p);
while (i < s_len && j < p_len) {
if (j == -1 || s[i] == p[j]) {
i++;
j++;
} else {
j = next[j];
}
}
if (j == p_len) { //主串包含子串
return i - j;
} else {
return -1; //主串不包含子串
}
}