表、栈和队列

1.抽象数据类型
(1). 抽象概念的存储数据结构及其可能的操作集合。
(2) 好处:
a. 编写一次,重复调用,代码重用率高
b. 修改实现代码不影响接口使用代码,利于修改和调试
(3)目标:
a. 函数模块化
b.实现和接口分离
2.表
(1)数组实现
空间开销大,且不利于插入和删除,故一般不用来实现链表,但可随机访问。
(2) 动态链表
a.节省空间,插入和删除方便,但只能顺序遍历访问
b. 常置表头header或哑结点
c. 使用指针访问结构成员之前一定确保指针不是NULL,比如free掉指针以后就不能继续访问,若有需要可以事先保留其部分初始内容。使用p,就要确定p不是NULL,使用p->next,就要确定p->next不是NULL。
d. 未初始化的指针只能保存或者跟踪其他指针存储的地址值,常用来做临时指针,若要存储结构,必须malloc分配相应的内存,然后用指针指向这块内存。不用的时候要free,避免内存泄漏。
e.几个函数:
void* realloc(void* ptr, unsigned newsize);
void* malloc(unsigned size);
void* calloc(size_t numElements, size_t sizeOfElement);
malloc调用形式为(类型*)malloc(size):在内存的动态存储区中分配一块长度为“size”字节的连续区域,返回该区域的首地址。
calloc调用形式为(类型*)calloc(n,size):在内存的动态存储区中分配n块长度为“size”字节的连续区域,返回首地址。
realloc调用形式为(类型*)realloc(*ptr,size):将ptr内存大小增大到size。
free的调用形式为free(void*ptr):释放ptr所指向的一块内存空间。
C++中为new/delete函数。
(3) 双向链表
多了一个previous指针
(4) 循环链表
首尾相连,可以单向或者双向,有无表头均可。
(5)多项式的加减乘除
分析:如果大多数项的系数均非零,推荐数组存储,反之动态链表。数组存储计算容易,动态链表需要处理合并同类项的问题。
(6)基数排序
最低位优先的方式进行桶式排序
这里写图片描述
(7)多重表
这里写图片描述
(8)链表的游标实现–静态链表
存储池执行malloc和free的功能

从存储池取元素和释放元素到存储池中
3.栈
(1)后进先出
a. 数组实现
b. 链表实现
(2)应用
a. 编译器检查程序语法错误,比如解决括号之类的必须成对出现,只需做一个空栈,如果是一个开放符号将其入栈,如果是一个封闭符号并且栈空的时候报错,否则弹出,如果弹出的不是对应的开放符号,则报错。在文件尾如果栈非空则报错。–在线算法
b. 计算后缀表达式(逆波兰记法),无需知道任何优先规则。遇到操作数就入栈,遇到操作符就弹出两个元素进行运算,并把结果入栈。最后栈只剩一个元素即为表达式结果。
c.中缀表达式转换后缀表达式,遇到操作数输出,遇到操作符如果比栈顶元素的优先级高就将操作符入栈,否则将栈顶出栈,然后把操作符入栈,特殊的遇到右括号时直接出栈直到左括号被弹出。
d. 函数调用
调用之前产生活动记录–栈帧保护现场。当递归不当的时候就会产生stackoverflow,致使程序崩溃。尾递归有时候会使用不当,可用goto去除,或者其他循环结构。
递归总能被彻底除去(编译器在转变成汇编语言时完成的),非递归虽然速度快,但不够清晰。
4.队列
(1)先进先出
a.数组实现–循环队列
b.链表实现
(2)主要应用在各种各样的“排队”场景中,离散事件的模拟等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值