一、栈的定义
暂时只允许在一端进行插入和删除操作的线性表。
栈顶:线性表允许进行插入和删除的那一端。
栈底:固定的,不允许进行插入和删除的另一端。
操作特性:先进后出。
二、顺序栈的基本操作
1.存储类型描述
typedef struct {
ElemType data[Maxsize];
int top;
};
top用于存储栈顶位置
2.初始化
void Initial(SqStack& S) //初始化
{
S.top = -1;
}
初始化top为-1,防止当对栈的最大使用空间不足时发生栈上溢。
3.判栈空
bool StackEmpty(SqStack S) //判空
{
if (S.top == -1)
return true;
else return false;
}
4.进栈
bool Push(SqStack& S) //进栈
{
if (S.top == Maxsize - 1)
return false;
ElemType value;
printf("Please enter the value:");
scanf_s("%d", &value);
S.data[++S.top] = value;
return true;
}
初始化top为-1时,top先加1,再入栈。
4.出栈
bool Pop(SqStack& S, ElemType& value) //出栈
{
if (S.top == -1)
return false;
value = S.data[S.top--];
return true;
}
初始化top为-1时,先出栈,top再减1。
4.读取栈元素
bool GetTop(SqStack& S, ElemType& value) //读取栈顶元素
{
if (S.top == -1)
return false;
value = S.data[S.top];
printf("The stack top value is %d\n", value);
return true;
}
三、共享栈
利用栈底位置相对不变的特性,令两个顺序栈共享一个一位数组空间,如图:
- 当top0 = -1;top1 = Maxsize时栈空,当top1 - top = 1时栈满;
- 进栈时top0先加1再赋值,top1先减1再赋值。出栈则相反。
四、链栈
链栈,即栈的链式存储结构,通常采用单链表实现。
其存储类型描述为:
typedef struct Linknode {
ElemType data;
struct Linknode* next;
}LiStack;
采用链式存储,便于结点的插入与删除,链栈的操作与链表类似,入栈和出栈的操作都在链表头进行。