数据结构概念总结
数 据 结 构
一.思维导图
二.重要概念的笔记
1.线性表:
1.除头结点无前驱有一个后继,尾结点无后继有一个前驱,其他节点均含有一个与之对应的前驱和后继。链表只能顺序查找,相应操作的时间复杂度:
-
找到指定元素:O(n)
-
插入删除结点:O(n)
2.链表的查找:从链表的头指针出发,顺链域next逐个结点往下搜索,直到搜索到第i个结点为止。因此,链表不是随机存取结构。
3.链表的插入:先找到表的第i-1的存储位置,然后插入。新结点先连后继,再连前驱。
4.链表的删除:首先找到i-1的存储位置p。然后令p–>next指向i的直接后继结点。最后释放结点i的空间.r=p->next;p->next=r->next;delete r;
2.栈和队列:
- 1.栈(LIFO):限制在栈顶进行插入和删除操作,包含顺序栈和链栈。可以用来解决迷宫问题、括号配对问题、递归等
#include<stack>
stack<int>s;//定义栈s
s.push();//入栈
s.pop();//栈顶元素出栈
s.empty();//判断栈是否为空
- 2.队列(FIFO):限制在队列的一端进行插入队尾(rear),另一端进行删除队头(front),包含顺序队列和链队列。可以用来解决迷宫问题、递归等。
#include<queue>
stack<int>q;//定义队列q
q.push();//将元素接到队列的尾端
q.pop();//将队列中第一个元素弹出
q.empty();//判断队列是否为空
3.串:
串是一个特殊的线性表,其数据元素可以是多个字符,模式匹配是串的一种重要运算。串既可以采用顺序存储结构,也可以采用链式存储结构。其中难点是KMP算法。
#include<string>
string str;//定义串str
4.数组和广义表
-
数组:数组的顺序存储分行优先和列优先。
-
广义表(Lists,又称列表):是一种非线性的数据结构,是线性表的一种推广。即广义表中放松对表元素的原子限制,容许它们具有其自身结构。广义表是n(n≥0)个元素a1,a2,…,ai,…,an的有限序列。
三.疑难问题及解决方案
1.模式串t=“abcaa”,以表格展示next 和nextval数组值。
j | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
t[j] | a | b | c | a | a |
next[j] | -1 | 0 | 0 | 0 | 1 |
nextval[j] | -1 | 0 | 0 | -1 | 1 |
起初自己预习计算nextval值时,以为当next[j]与t[j]相等时,nextval[j]的值为next[j]-1,当next[j]与t[j]不相等时,nextval[j]=next[j]。直到课堂上发现我自己理解有误,计算的结果与答案不符。于是我课后去网站上搜索了一番,反复观看kmp算法讲解视频,最后懂得了nextval的正确计算方法是:当next[j]与t[j]相等时,nextval[j]=nextval[next[j]],当next[j]与t[j]不相等时,nextval[j]=next[j]。