数据结构是需要掌握的一个重要内容,忘记在哪路看到的,程序等于数据结构加算法。数据结构包括逻辑结构、存储结构和对数据的运算。
1,逻辑包括(1)集合;(2)线性结构;(3)树形结构;(4)图或者网状结构
2,存储结构包括(1)顺序方式;(2)链接方式;(3)索引方式;(4)散列方式
3,数据的运算就是对数据进行处理,常见的有增删改查和排序。
这里引出第一个重要内容:线性表;
定义:先行表是由n个相同数据元素组成的线性序列;
线性表的顺序存储结构,就是各元素顺序相连,是最简单的存储结构了。对线性表的线性结构进行增加或删除元素时需要对整个线性表进行修改,对修改位置后的所有元素进行移位,应该说是个效率比较低的算法。
第二个重要内容:栈;
栈是一种线性结构,对栈的操作:插入、删除等运算都要在栈的同一侧进行,这一侧称为栈顶,相对的另一侧称为栈底。在单片机中或者说在程序开始进行之前会有堆栈的建立,重要的是栈的建立,这里的栈的结构应该就是如此。由于进栈和出栈都是在同一侧进行的,所以栈是一种先进后出(LIFO表)。
栈的顺序存储结构,就是用一组连续的空间地址存储栈的元素,用一个栈顶单元指示栈顶的当前位置。
栈结构:stack结构,有两个域,一个是以栈的元素指示的一维数组,另一个是整形栈顶指示域。这里我将其定义成以下的代码:
typedef sruct
{
unsigned char e[max];
unsigned char top;
}stack_t;
栈里元素范围是e[0]至e[top-1],栈里位置最大的元素就是满栈时的e[max-1],当top=0就是空栈了。
栈的基本运算:置空栈;进栈;出栈;读栈顶元素;判栈空。
个人私以为置空栈只要用个memset函数就行了。这里写一下进栈和出栈的程序:
uint8_t push_stack(stack_t *stack,uint8_t data)
{
if(stack->top>=sizeof(stack->e))
return Error; /* 栈满出错 */
else stack->e[stack->top++]=data; /* 将元素置到栈顶并更新栈顶位置 */
}
uint8_t pop_stack(stack_t *stack,uint8_t *data)
{
if(stack->top==0)
return Error; /* 栈空出错 */
else *data=stack->e[--top]; /* 将栈顶此位的元素读出来并将栈顶降一位 */
}
《三级偏软》树上还提到可以将两个类型一致的栈的栈底设在一个数组两侧,栈顶相遇即为栈满溢出,这个骚操作可以留意。