《数据结构》复习笔记
由HDU-STEA_banjiu修改于2021年1月9日
参考书目:严蔚敏《数据结构(第二版)》、王导论坛《数据结构考研复习指导》、HDU-STEA_YY《<数据结构>复习笔记》
第三章 栈和队列
1.栈的定义(stack)
栈是只允许在一端进行插入或删除操作的线性表,又称为后进先出表,LIFO表(Last in First Out)。插入、删除端称为栈顶,另一端称栈底。表中无元素称空栈。
2.栈的基本操作
-
InitStack(&s)
初始化一个空栈;
-
DestroyStack(&s)
销毁一个栈,并释放栈s占用的存储空间(”&“表示引用调用);
-
StackEmpty(s)
判栈空,若栈空则返回true,否则返回false;
-
StackFull(s)
判栈满;
-
Push(&s,x)
进栈,若栈S未满,则将x加入使之成为新栈顶;
-
Pop (&s,&x)
出栈,若栈S非空,则用x返回栈顶元素;
-
GetTop(s,&x)
取栈顶元素,若栈非空,则用x返回栈顶元素。
3.顺序栈
栈的顺序存储结构称顺序栈。它利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指示当前栈顶元素的位置。
#define MaxSize 50
typedef struct
{
ElemType data[MaxSize]; //栈底指针 存放数据
int top; //栈顶指针
} SqStack;
- 栈顶指针:S.top,初始时设置S.top=-1;栈顶元素:S.data[S.top]。
- 进栈操作:栈不满时,先栈顶指针加1,再送值到栈顶元素。
- 出栈操作:栈非空时,先取栈顶元素值,再将栈顶指针减1。
- 栈空条件:S.top==-1;栈满条件:S.top==MaxSize-1;栈长:S.top+1。
栈和队列的判空、判满条件,会因实际条件的不同而不同,所以,上面提到的方法以及下面的代码实现只是在栈顶指针设定的条件下的相应方法。
4.栈的上溢和下溢
当栈满时,做进栈运算必定产生空间溢出,称“上溢”。 当栈空时,做退栈运算必定产生空间溢出,称“下溢”。上溢是一种错误应设法避免,下溢常用作程序控制转移的条件。
5.在顺序栈上的基本运算
1)置空栈
Void InitStack(SqStack &s)
{
s.top = -1; //初始化栈顶指针
}
2)判栈空
bool StackEmpty(SqStack s)
{
if(s.top == -1)
return true; //栈空
else
return false; //栈非空
}
3)判栈满
int StackFull(SqStack s)
{
if(s.top == stacksize - 1)
return true; //栈满
else
return false; //栈非满
}
4)进栈
bool Push(SqStack &s, ElemType x)
{
if (StackFull(s))
return false; //栈满,报错
s.data[++s.top] = x