功能受限的表:
栈:只有一个进出的出入口的表结构,先进后出,FILO
顺序栈:
数据项:
存储元素的内存首地址
栈的容量
栈顶位置
运算:
创建、销毁、入栈、出栈、栈满、栈空、栈顶
注意:
栈顶指向顶部的第一个数据,称为满增栈
栈顶指向接下去要入栈的位置,称为空增栈
满减栈、空减栈
链式栈:
数据域:
栈顶
节点数量
运算:
创建、销毁、入栈、出栈、栈空、栈顶
栈的应用:
1、函数的调用(栈内存)
2、生产者和消费者模型(栈作为仓库)
3、表达式的解析
栈的常见笔试面试题:
某个序列是入栈顺序,判断哪个序列为合理的出栈顺序
1 2 3 4 5
3 1 2 4 5 No
1 2 3 4 5 yes
练习:实现一个函数,判断序列b是不是序列a的出栈顺序
bool is_popstack(int* a,int* b,int len)
{
// 创建一个栈
// 按照a的顺序一个一个入栈
// 按照b的顺序出栈
// 最后判断栈是否为空
}
问题:两个栈如果使用能够让空间利用率最大化?
队列:一个端口进,另一个端口出,先进先出 FIFO
顺序队列:
数据项:
储存元素的内存首地址
容量
队头
队尾 接下去要入队的位置
运算:
创建、销毁、入队、出队、队空、队满、队头、队尾、元素个数
顺序队列是由一维数组+队头位置front+队尾位置rear组成,入队时rear+1,出队时front+1,为了能够让队列反复使用,我们要把一维数组想象成一个环,因此rear、front加1后要用队列的容量求余
rear = (rear+1)%cal;
front = (front+1)%cal;
如何判断队空: front == rear
如何判断队满: front == (rear+1)%cal
1、代价是空一个位置不能使用(常考)
2、添加一个数据项标记队列是空或者满(元素个数)
如何计算元素的数量:
(rear-front+cal)%cal
链式队列: