第三章 栈和队列
3.1栈(Stack)
3.1.1 栈的基本概念
- 栈的定义
- 栈是特殊的线性表:只允许在一端进行插入或删除操作的线性表, 其逻辑结构与普通线性表相同;数据的运算:插入删除操作有区别;
- 栈顶:允许进行插入和删除的一端 (最上面的为栈顶元素);
- 栈底:不允许进行插入和删除的一端 (最下面的为栈底元素);
- 空栈:不含任何元素的空表;
- 特点:后进先出
Last in firsr Out(LIFO)
(后进栈的元素先出栈); - 缺点:栈的大小不可变,解决方法——共享栈;
- 栈的基本操作 (运算)
"创&销"
InitStack(&S)
初始化栈:构造一个空栈S,分配内存空间;DestroyStack(&S)
销毁栈:销毁并释放栈S所占用的内存空间;
"增&删"
Push(&S, x)
进栈:若栈S未满,则将x加入使其成为新栈顶;Pop(&S, &x)
出栈:若栈S非空,则弹出(删除)栈顶元素,并用x返回;
"查&其他"
GetTop(S, &x)
读取栈顶元素:若栈S非空,则用x返回栈顶元素;(栈的使用场景大多只访问栈顶元素);StackEmpty(S)
判空: 判断一个栈S是否为空,若S为空,则返回true,
否则返回false
;
- 栈的常考题型
- 给个进栈顺序,判断有哪些合法的出栈顺序;
例:进栈顺序为:a -> b -> c -> d -> e
合法的出栈顺序:e d c b a / b e d c a (出栈和进栈交替进行) / …
结论
3.1.2 栈的顺序存储
- 顺序栈的定义
采用顺序存储的栈称为顺序栈,它利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指示当前栈顶的位置。
#define MaxSize 10 //定义栈中元素的最大个数
typedef struct{
ElemType data[MaxSize]; //静态数组存放栈中元素
int top; //栈顶元素
}SqStack;
void testStack(){
SqStack S; //声明一个顺序栈(分配空间)
//连续的存储空间大小为 MaxSize*sizeof(ElemType)
}
- 栈顶指针:S.top,初始值 s.top=-1;栈顶元素:S.data[S.top];
- 进栈操作:栈不满时,栈顶指针先加 1 ,再赋值;
- 出栈操作:栈非空时,先取栈顶元素值,再将栈顶指针减 1;
- 栈空:S.top==-1;
- 栈满:S.top==MaxSize -1;
- 栈长:S.top+1;
- 顺序栈的基本操作
#define MaxSize 10 //定义栈中元素的最大个数
typedef struct{
ElemType data[MaxSize]; //静态数组存放栈中元素
int top; //栈顶元素
}SqStack;
//初始化栈
void InitStack(SqStack &S){
S.top = -1; //初始化栈顶指针
}
//判栈空
bool StackEmpty(SqStack S){
if(S.top == -1) //栈空
return true;
else //栈不空
return false;
}
//新元素进栈
bool Push(SqStack &S, ElemType x){
if(S.top == MaxSize - 1) //栈满
return false;
S.top = S.top + 1; //指针先加1
S.data[S.top] = x; //新元素入栈
/*等价于
S.data[++S.top] = x;
*/
return true;
}
//出栈
bool Pop(SqStack &x, ElemType &x){
if(S.top == -1) //栈空,报错
return false;
x = S.data[S.top]; //栈顶元素先出栈
S.top = S.top - 1; //栈顶指针减1
return true;
/*
x = S.data[S.top--];
*/
//只是逻辑上的删除,数据依然残留在内存里
}
//读栈顶元素
bool GetTop(SqStack S, ElemType &x){
if(S.top == -1)
return false;
x = S.data[S.top]; //x记录栈顶元素
return true;
}
void testStack(){
SqStack S; //声明一个顺序栈(分配空间)
InitStack(S);
//...
}
另一种方式: 也可以初始化时定义 S.top = 0 :即栈顶指针(top)指向栈顶元素的下一个位置;
- 判空:if(S.top == 0)
- 进栈使用:S.data[S.top++] = x;
- 出栈使用:x = S.data[–S.top];
- 判断栈满:s.top == MaxSize
顺序栈的缺点
- 栈的大小不可变
- 共享栈
两个栈共享同一片空间
#define MaxSize 10 //定义栈中元素的最大个数
typedef struct{
ElemType data[MaxSize]; //静态数组存放栈中元素
int top0; //0号栈栈顶指针
int top1; //1号栈栈顶指针
}ShStack;
//初始化栈
void InitSqStack(ShStack &S){
S.top0 = -