您的位置:首页 > 理论基础 > 数据结构算法

【数据结构】栈与队列基础

2017-10-18 22:02 344 查看
栈(Stack)又称堆栈,简称FILO表,操作的一端称为栈顶(Top),栈有两种存储表示方法:

1、顺序栈

typedef struct{
ElemType *stackdata;//指向一维数组的起始地址
int top;       //实际上是数组的下标,永远指向已保存元素空间的下一个位置
int stacksize;
}SeqStack;//顺序栈类型说明


栈在初始化的时,应当预分配stacksize大小的空间。

顺序栈在入栈的时候需要进行栈满判定,如果栈满应当用realloc函数追加存储空间;在出栈时,需要进行判空。

2、链栈

typedef struct node{
Elemtype data;  //存放栈中的数据元素
Struct node *next;   //指针域
}StackNode,*Linkstack;


链栈与单链表无异,相当于用头插法只在链表头部进行操作。出栈操作(*e=top->next->data)前需要判空,出栈后删除出栈结点。
P.S. 在计算机科学中将一个直接或间接调用自己的函数称作递归函数,为了保证递归函数的正确执行,系统会设立一个“递归工作站”,作为整个递归函数运行期间的数据存储区。

总结:栈的出入只在头部进行操作。

队列是一种先进先出(FIFO)的线性表,简称FIFO表。

能够插入元素的一端叫作队尾(Rear)允许删除的一端叫做队头(Front),可以想象成银行排队,在队尾排队,队头出队办理业务。

1、链队

链队的队头是由头结点的指针域指示的,头指针始终指向头结点,当尾指针和头指针都指向头结点时为队空。

元素入队时,每次生成一个新结点接到队尾,然后让队尾指针指向新节点即可;元素出队就是将队列的第一个结点(队头)从链表中删除,并获取其相关的数据元素。

2、循环队列

2.1 队列的顺序存储结构

typedef struct{
Elemtype data[Max_Qsize];  // Max_Qsize是实际最大元素个数
int front; //头指针,实际上是数组下标
int rear;  //尾指针,实际上是数组下标
}SeqQuene;


初始化时,front=rear=0;头指针总是指向实际队头元素位置,尾指针总是指向队尾元素的下一个位置;插入元素时尾指针增1,删除队头元素时,头指针增1。容易理解,此队列容易发生“假溢出”。

2.2 循环队列

循环队列是解决队列“假溢出”的一种有效方法。循环队列假想将队列首尾相连,通过指针的循环来实现。若指针p增加1后达到最大空间位置,应将指针设为0,即p=(p+1)%Max_Qsize。

循环队列的判空有两种方法:1、设置布尔变量来区分出入队,从而判断空满。2、少用一个元素的空间:约定入队前,检查(rear+1)&Max_Qsize是否等于头指针,即rear在循环意义上+1是否等于头指针,若相等则为队满(rear所指的空间始终为空)。

P.S.此为本人学习数据结构时对重点内容的一些整理,和对难理解内容的标注和思考笔记,欢迎大家与我沟通交流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: