<!--time--2020/8/30-->
一、栈
栈的定义与特点:
栈(stack)是限定仅在表尾进行插入或删除操作的线性表。因此,对于栈来说,可以进行插入或删除的表尾端称为栈顶(top),另一端的表头称为 栈底(bottom)。
空栈:若栈中无元素,则称为 空栈。
进栈(PUSH):元素插入到栈中的操作,也叫入栈,压栈。
出栈(POP):删除栈顶元素的操作,也称为退栈、弹栈。
栈的操作符合 后进先出* 原则,因此栈又称为 后进先出的线性表(Last In First Out , LIFO)。
栈的抽象数据类型定义:
ADT 栈{
数据对象:D={ai | ai∈ElemSet, i=1,2,…n,n≥0}
数据关系:S={<ai-1,ai> | ai-1,ai∈D,i=2,…,n}
约定a1为栈底,an为栈顶
基本操作:
init_stack(*stack)
操作结果:初始化栈,构造一个空的栈
get_length(stack)
初始条件:栈stack已存在
操作结果:返回栈的长度,即stack中元素个数
is_empty(stack)
初始条件:栈stack已存在
操作结果:若stack为空栈则返回1,否则返回0
get_top(stack, *e)
初始条件:栈stack已存在且不为空
操作结果:用e返回栈顶元素值,不出栈
push(*stack, e)
初始条件:栈已存在
操作结果:插入元素e为新的栈顶元素
pop(*stack, *e)
初始条件:栈已存在,且不为空
操作结果:删除栈顶元素,并用e返回其值
}ADT 栈
栈为线性表,有两种存储方式,分别为:顺序栈和链栈
二、顺序栈的代码实现
顺序栈的定义及初始化
须知:1、栈遵循后进先出原则,因此栈顶变化较多,我们需要定义一个栈顶标记来始终指向栈顶元素
2、初始化时让 top初始化为 -1 ,标记为空栈。当压栈时,top会随着数组下标开始从0变化。即 :进入一个元素,top++一次
3、获取栈的长度操作,实际为获取栈中有效元素个数,即top所指元素的数组下标 + 1
入栈与出栈操作:
注意:
1.若进行入栈操作时,先判断栈是否满,若栈满则不可继续入栈。
2.若进行出栈操作时,先判断栈是否为空,若栈空则不可继续出栈操作。
3.取栈顶元素类似于出栈操作,只不过不删除栈顶元素(即栈顶标记无需自减)
实现代码如下:
//入栈和出栈
/*
一、入栈:判断栈是否栈满
二、出栈:判断是否空栈
三、取栈顶:类似出栈,但不是删除栈顶元素
*/
int push(SEQ_STACK *S,SElemType e) {
if (S->top == MAX_SIZE - 1)
{
return 0;//操作失败
}
S->top++;//栈顶标记 +1 ,指向新的栈顶 这里注意,压栈操作先 栈顶指针 S->top++ 再进元素
S->data[S->top] = e;
return 1;
}
int get_pop(SEQ_STACK *S, SElemType *e) { //获得栈顶元素
if (S->top == -1)
{
return 0;//空栈,操作失败
}
*e = S->data[S->top];//将栈顶元素赋值给指针e指向的变量,
return 1;
}
int pop(SEQ_STACK *S,SElemType *e) {
if (S->top == -1)
{
return 0;//空栈,操作失败
}
*e = S->data[S->top];//将栈顶元素赋值给指针e指向的变量,
S->top--;//栈顶标记 -1 ;这里注意,出栈操作先 取出元素,再栈顶指针 S->top-- 操作
return 1;
}
三、顺序栈源码: