levels of contents

数据结构与算法(3-1)--栈和队列

python版实现

定义

栈是限定仅在表尾进行插入或删除操作的线性表。因此对栈来说,表尾端有其特殊含义,称为栈顶,表头端称为栈底。不含元素的空表称为空栈。栈顶实现元素的进出,栈的修改遵循后进先出的原则。因此,栈又称为后进先出(last in first out)的线性表(简称LIFO结构)。

stackdemo

表示及实现

栈是一种 "特殊" 的线性存储结构,因此栈的具体实现有以下两种方式:

  1. 顺序栈:采用顺序存储结构可以模拟栈存储数据的特点,从而实现栈存储结构;
  2. 链栈:采用链式存储结构实现栈结构;

顺序栈

顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。

先为栈分配一个基本容量,然后在应用的过程中,当栈的空间不够使用时za再逐段扩大。为此可设定两个常量:STACK_INIT_SIZE(存储空间初始分配量)和STACKINCREMENT(存储空间分配增量),并以下述类型说明作为顺序栈的定义。

typedef struct {
	int *base;//类型要看元素是什么类型
	int *top;
	int stacksize; // 当前栈可使用的最大容量。
} Sqstack;

top=base可作为栈空的标记。每当插入新元素时,指针top+1;删除时,指针top-1;因此,非空栈中的栈顶指针始终在栈顶元素的下一个位置上。

链栈

栈的操作即在单链表操作基础上,push则是在头结点前添加元素,pop则是删除头结点。

linkedstackdemo

队列

python版实现

定义

队列(queue)是一种先进先出(first in first out, FIFO)的线性表,它只允许在表的一端进行插入,而在另一端删除元素,允许插入的一端叫做队尾(rear/tail), 允许删除的一端则称队头(front)

queuedemo

链队列

用链表表示的队列,称为链队列

linkedqueuedemo

一个链队列显然需要两个分别指示队头和队尾的指针才能唯一确定。为了操作方便,我们也给队列添加一个头结点,并令头指针指向头结点。由此,空的链队列的判决条件是头指针和尾指针均指向头结点

循环队列

与顺序栈类似,在队列的顺序结构中,除了用一组地址连续的存储单元依次存放从队列头到队列尾的元素之外,尚需附设两个指针front和rear分贝指示队列头元素及队列尾元素的位置。

circlequeuedemo

用此方法表示循环队列,就无法用Q.front=Q.rear来判断队列空间是空还是满。可有两种处理方法:

  • 另设一个标志位以区别队列是空还是满
  • 少用一个元素空间,约定以“队列头指针在队列尾指针的下一位置上”作为队列呈满状态的标志
posted @ 2020-11-15 11:25  panky  阅读(161)  评论(0)    收藏  举报