目录
一、思维导图
二、重要概念笔记
1、链表头插法
void CreateListF(LinkList& L, int n) {
L = new LNode;
LinkList p;
ElemType data;
L->next = NULL;
for (int i = 0; i < n; i++) {
cin >> data;
p = new LNode;
p->data = data;
p->next = L->next;
L->next = p;
}
}
2、链表尾插法
void CreateListR(LinkList& L, int n) {
LinkList tail, p;
ElemType data;
L = new LNode;
tail = L;
while (n) {
cin >> data;
p = new LNode;
p->data = data;
p->next = NULL;
tail->next = p;
tail = p;
n--;
}
}
3、单链表逆置
void ReverseList(LinkList& L) {
LinkList p1, p2=NULL;
L = L->next;
while (L) {
p1 = new LNode;
p1->data = L->data;
p1->next = p2;
p2 = p1;
L = L->next;
}
p1 = new LNode;
p1->next = p2;
L = p1;
}
4、栈(stack)
栈之定义格式
stack<Elemtype> StackName;
栈之特点
先进后出式
栈之操作函数
出栈Stackname.pop();
入栈Stackname.push();
空栈判断Stackname.empty();
栈中元素个数Stackname.size();
栈顶元素Stackname.top();
5、队列(queue)
队列之定义格式
queue<Elemtype> QueueName;
队列之特点
先进先出式
队列之操作函数
出队QueueName.pop();
入队QueueName.push();
队头元素QueueName.front();
队尾元素QueueName.back();
空队列判断QueueName.empty();
队列中元素个数QueueName.size();
6、串(string)
串之定义格式
string StrName;
串之操作函数
读取一行getline(cin,StrName);
截取字符串StrName.substr(num1,num2);
(num1表示截取位置,num2表示截取个数)
字符串长度StrName.size();
字符串连接
str1="hello ";
str2="world";
str3=str1+str2;//str3最终为hello world
三、疑难问题解决
关于字符串中KMP算法的next数组。
在求一个串对应字符的next数组值时,根据算法的特点,有多种next数组求法,例如从-1开始和从0开始,而恰巧课堂中和书本上正好不同,起初处于懵懂状态,无法在两种模式中切换自如,但是在一番观察后发现,花样再如何变都是异曲同工,给从-1开始的next数组每个元素加一,恰好是从0开始的next数组,再经过多次练习后,掌握该知识点。
//从-1开始的next数组计算代码
void GetNext(string t, int next[])
{
int j = 0, k = -1;
next[0] = -1;
while (j < t.size() - 1)
{
if (k == -1 || t[j] == t[k])
{
j++;
k++;
next[j] = k;
}
else
k = next[k];
}
}