数据结构(二)(三)栈和队列
堆栈
1 定义
1.1 具有一定操作约束线性表,只能在一端(栈顶,Top)做插入删除
插入数据:入栈Push
删除数据:出栈Pop
后入先出:LIFO
先入后出:FILO
1.2 Stack
1.2.1 一个或者多个有穷线性表
1.2.2 操作集:长度MaxSize,堆栈元素ElementType
Stack CreateStack(int MaxSize);
int IsFull(Stack S,int MaxSize); 判断栈是否满
void Push(Stack S,ElementType item); 压栈
int IsEmpty(Stack S); 判断堆栈S是否为空
ElementType Pop(Stack S); 删除并返回栈顶元素
1.3 FILO,LIFO
1.3.1 可用于表达式求职,迷宫求解等深广度优先搜索
1.3.2 表达式求值后缀例:62/3-42*+=?
1.3.3 相当6/2-3+4*2=8
将计算运算符压入符号栈中遇到优先级比栈顶元素低的则弹出
括号需要注意左右括号的匹配,同级运算符按照从左往右的优先级
2 实现
2.1 顺序存储
2.1.1 初始化
Top=-1表示栈空
2.1.2 入栈
2.1.3 出栈
2.1.4 一个数组实现两个堆栈
建栈
Top1和Top2相遇栈满
入栈
压栈判断栈满,通过Tag标识区分对哪个栈的操作
出栈
出栈判断栈空
2.2 链式存储
2.2.1 建栈
单链表链栈,栈顶应该在表头
2.2.2 入栈
入栈可以不用判断栈满,链表大小动态分配
2.2.3 出栈
队列
1 定义
1.1 具有一定操作约束的线性表FIFO(先进先出表)
1.2 只能在一段进行插入在另一端进行删除
1.3 数据对象集:一个有0个或者多个元素的又穷线性表
1.4 操作集:长度为MaxSize的队列Q,和队列元素ElementType
Queue Create(int MaxSize); //生成长度为MaxSize的空队列
int IsFullQueue(Queue Q,int MaxSize); //判断队列Q是否已满
void AddQueue(Queue Q,ElementType item); //将数据元素item插入队列Q中
int IsEmptyQueue(Queue Q); //判断队列是否为空
ElementType OutDeleteQueue(Queue Q); //将对头数据元素从队列中删除并返回
2 队列顺序存储
2.1 创建
front记录对头元素前一个位置rear记录队尾,浪费一个位置判断队列满情况
2.2 初始化空间
2.3 判断队满
队尾位置加一模队最大存储空间==队头元素
2.4 将数据元素插入队列
如图
2.5 判断队空
2.6 出队删除
3 队列的链式存储
3.1 创建
3.2 判断队空
3.3 入队
忘记计数队列中元素的个数了,立个flag每次添加时候++,删除时候--