链表和队列复习
来源:互联网 发布:deepin linux 15.4.1 编辑:程序博客网 时间:2024/05/29 19:49
顺序栈——栈的顺序存储结构
栈的顺序存储结构简称为顺序栈。即用一组地址连续的存储单元依次存储自栈底到栈顶的元素。可用数组来实现顺序栈,附设top指针指示栈顶元素在顺序栈中的位置。
#define STACK_INIT_SIZE 100;//初始分配量
#define STACKINCREMENT 10; //分配增量
typedef struct {
SElemType *base; //栈底
SElemType *top; //栈顶
int stacksize; //当前可用最大容量,以元素为单位
}SqStack;
可用数组来实现顺序栈。
因为栈底位置是固定不变的,所以可以将栈底位置设置在数组的两端的任何一个端点;栈顶位置是随着进栈和退栈操作而变化的,故需用一个整型变量top
入栈:top++
出栈:top--
栈空:top==base
基本操作:
InitStack(&S) 构造一个空栈S
GetTop(S,&e) 用e返回栈顶元素
Push(&S,e) 插入元素e为新的栈顶元素(入栈)
Pop(&S,e) 删除栈顶元素,用e返回(出栈)
链式栈——栈的链式存储结构
插入和删除操作仅限制在表头位置上进行。
由于只能在链表头部进行操作,故链表没有必要像单链表那样附加头结点。栈顶指针就是链表的头指针。
typedef struct StackNode{
datatype data
struct StackDode *next
}StackNode;
链式存储结构定义
typedef struct {
SLink top; // 栈顶指针
int length; // 栈中元素个数
} Stack;
p -> data = e;
p -> next = S.top;
// 链接到原来的栈顶
S.top = p;
退栈e = S.top -> data; // 返回栈顶元素
q = S.top;
S.top = S.top -> next; // 修改栈顶指针
--S.length; // 栈的长度减1
栈运用:迷宫算法思想:若当前位置“可通”,则纳入路径,继续前进;若当前位置“不可通”,则后退,换方向继续探索;若四周“均无通路”,则将当前位置从路径中删除出去。
设定当前位置的初值为入口位置;
do{
若当前位置可通,
则{将当前位置插入栈顶;
若该位置是出口位置,则算法结束;
否则切换当前位置的东邻方块为
新的当前位置;
}
否则 {
}
}while (栈不空);
若栈不空且栈顶位置尚有其他方向未被探索,
则设定新的当前位置为: 沿顺时针方向旋转
找到的栈顶位置的下一相邻块;
若栈不空但栈顶位置的四周均不可通,
则{删去栈顶位置;// 从路径中删去该通道块
若栈不空,则重新测试新的栈顶位置,
直至找到一个可通的相邻块或出栈至栈空;
若栈空,则表明迷宫没有通路。
}
链队列:用链表表示的队列简称为链队列。
实质上就是限定在表头做删除操作,在表尾做插入操作的单链表。所有的操作都在两端进行。
两个指针:
队头指针Q.front指向头结点
队尾指针Q.rear指向尾结点
队列的链式存储结构
typedef struct QNode { //元素结点
QElemType data;
struct QNode *next;
}QNode, *QueuePtr;
typedef struct{ //特殊结点
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
}LinkQueue;
循环队列:克服上述假上溢现象的方法是将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量,存储在其中的队列称为循环队列。
在循环队列中进行出队、入队操作时,头尾指针仍要加1,朝前移动。只不过当头尾指针指向向量上界(MAXSIZE-1)时,其加1操作的结果是指向向量的下界0。
typedef struct {
QElemType *base; // 动态分配存储空间
int front; // 头指针,若队列不空,指向队列
//头元素
int rear; // 尾指针,若队列不空,指向队列
//尾元素的下一个位置
} SqQueue;
不能用动态分配的一维数组来实现循环队列,初始化时必须设定一个最大队列长度。
初始化 Status InitQueue (SqQueue &Q)
Q.front=Q.rear=0;
求队列的长度 int QueueLength(SqQueue Q)
return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
入队 Status EnQueue (SqQueue &Q, QElemType e)
if ((Q.rear+1) % MAXQSIZE ==Q.front) return ERROR; //队满
Q.rear = (Q.rear+1)%MAXQSIZE;
出队 Status GetHead(SqQueue Q,QElemType &e)
if (Q.front==Q.rear) return ERROR;//队空
Q.front = (Q.front+1) % MAXQSIZE;
- 链表和队列复习
- 复习 [数据结构] ---- 栈和队列
- 数据结构复习之线性表、栈和队列 (上)
- 数据结构复习之线性表、栈和队列 (下)
- 《数据结构》复习之线性表(栈和队列)
- 复习-数据结构之栈和队列
- 队列和链表
- 队列和链表
- 链表和队列
- 循环队列和链表队列代码
- 一步一步复习数据结构和算法基础-栈和队列(1)
- 一步一步复习数据结构和算法基础-栈和队列(2)
- 一步一步复习数据结构和算法基础-链式队列
- 数据结构复习——第三章:栈和队列
- 【NOIp复习】数据结构之栈、队列和二叉树
- 数据结构===》栈和队列(复习心得)
- 链表复习头插和尾插法
- 数据结构复习篇:队列
- ThinkPHP3.1快速入门(12)自动验…
- 网页设计中常用的19个Web安全字体
- CSS3 box-shadow Property
- u-boot1.3.4
- CSS3 background-size Property
- 链表和队列复习
- CSS3 text-shadow Property
- CSS3 word-wrap Property
- OpenCV IplImage和GDI+ Bitmap的相互转换
- CSS3 2D Transforms
- CSS3 3D Transforms
- CSS3 Animations
- ThinkPHP3.1快速入门(13)自动完…
- event keycode大全