数据结构(二)(三)栈和队列

堆栈

img

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表示栈空

img

2.1.2 入栈

img

2.1.3 出栈

img

img

2.1.4 一个数组实现两个堆栈

建栈

Top1和Top2相遇栈满

img

入栈

压栈判断栈满,通过Tag标识区分对哪个栈的操作

img

出栈

出栈判断栈空

img

2.2 链式存储

2.2.1 建栈

单链表链栈,栈顶应该在表头

img

2.2.2 入栈

入栈可以不用判断栈满,链表大小动态分配

img

2.2.3 出栈

img

队列

img

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记录队尾,浪费一个位置判断队列满情况

img

2.2 初始化空间

img

2.3 判断队满

队尾位置加一模队最大存储空间==队头元素

img

2.4 将数据元素插入队列

img

如图

img

2.5 判断队空

img

2.6 出队删除

img

3 队列的链式存储

3.1 创建

img

3.2 判断队空

img

3.3 入队

img

忘记计数队列中元素的个数了,立个flag每次添加时候++,删除时候--

3.4 出队

img

猜你喜欢

转载自www.cnblogs.com/binjz/p/12501332.html