在计算机科学中,数据结构(data structure)是计算机中存储、组织数据的方式。
数据结构意味着接口或封装:一个数据结构可被视为两个函数之间的接口,或者是由数据类型联合组成的存储内容的访问方法封装。 ---wikipedia.org
存储线性数据集合,都有顺序结构和链式结构
链表
链表是线性数据集合的链式表示方法(数组是顺序表示方法)
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针。
单向链表
data&next->data2&next2->data&null
复制代码
双向链表
双向链表中不仅有指向后一个节点的指针,还有指向前一个节点的指针。
这样可以从任何一个节点访问前一个节点,当然也可以访问后一个节点,以至整个链表。
一般是在需要大批量的另外储存数据在链表中的位置的时候用。
复制代码
循环链表
head->data&next->data2&next2->data&head
复制代码
在一个循环链表中, 首节点和末节点被连接在一起。这种方式在单向和双向链表中皆可实现。要转换一个循环链表,你开始于任意一个节点然后沿着列表的任一方向直到返回开始的节点。这种列表很利于节约数据存储缓存?
块状链表 其它扩展 存储结构
to be continued
2019年3月6日20点58分
堆栈
A stack is an abstract data type that serves as a collection of elements, with two principal operations:
- push, which adds an element to the collection, and
- pop, which removes the most recently added element that was not yet removed.
堆栈是操作受限制的线性数据结构,所以是先进后出,限制在栈顶top对数据插入删除。
顺序结构
struct Stack {
int val[10];
int top;
};
bool empty(stack *stk) {
return stk->top == 0;
}
void push(stack *stk, int x) {
stk->top = stk->top + 1;
stk->val[stk->top] = x;
}
int pop(stack *stk) {
if (empty(stk))
return STACK_POP_ERR;
else {
stk->top = stk->top - 1;
return stk->val[stk->top + 1];
}
}
复制代码
链式结构
申请哨兵节点,使用头插法,其实就是单链表:
(1)STACK_EMPTY():判断栈是否为空
(2)PUSH(X):向栈中添加一个值,不需要注意栈是否为满的,只需要判断是否申请到内存。
(3)POP():从栈中弹出一个值,注意栈是否为空
复制代码
其他扩展
在数据结构的书上看到过申请一个数组,分别把两端当作栈底,可以充分利用空间(还有吗?)
to be continued
2019年3月6日21点43分
队列
与栈不同,它是一种先进先出结构。
队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。
队列的实现
(1)顺序结构
(2)链式结构
队列要记录的数据
- 队首位置front:第一个元素位置
- 队尾位置rear:下一个元素要插入的位置(最后一个元素的下一位置)
- 队列最大大小size
队列的操作
- ENQUEUE(x):入队
- DEQUEUE():出队
- EMPTY():队列为空,front=rear
- FULL():队列为满,front=(tail+1)%size(链式不需要)
单链队列 循环队列 阵列队列
to be continued
2019年3月6日22点00分