目录
3.1 栈
3.1.1 栈的基本概念
1. 栈的定义
栈(Stack)是只允许在一端进行插入或删除操作的线性表,首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。其操作特性是先进后出或是后进先出(First in Last out)。
2. 栈的基本操作
InitStack(&S) :初始化栈
StackEmpty(S) :判断栈空
Push(&S,x) :元素进栈,若S未满,将x进栈
Pop(&S,&x) :读栈顶元素,若栈S非空,弹出栈顶元素
GetTop(S,&x) :读栈顶元素,若栈S非空,用x返回栈顶元素
DestroyStack(&S) :销毁栈,并释放S的存储空间。
在解答算法题时,若题干未做出限制,则可直接使用这些基本的操作函数。
3.1.2 栈的顺序存储结构
1. 栈的定义
采用顺序存储的栈称为顺序栈,它利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针---并非类型为指针而是以整型数组替代的指针 ,指示当前栈顶元素的位置。
//顺序栈的定义
#define MAX 10 //定义栈长度
typedef int ElemType;
typedef struct {
ElemType data[MAX]; //静态数组存放数组元素
int top; //栈顶指针
}SqStack
栈空条件:;栈满条件:。
2. 初始化一个栈
void InitStack(SqStack &S)
{
S.top=-1;
}
3.进栈操作
bool Push(SqStack S)
{
if (S.top = MAX-1)
return false;
S.data[++S.top]=x;
return true;
}
4.出栈操作
bool Pop(SqStack &S, ElemType &x)
{
if (S.top = -1) {
return false;
}
x = S.data[S.top--]; //x = S.data[S.top]; S.top--;
return true;
}
5.读取栈顶元素
bool GetTop(SqStack S, ElemType& x)
{
if (S.top = -1)
return false;
x = S.data[S.top];
return true;
}
7.共享栈和一些操作
利用栈底位置相对不变的特性,可以让两个顺序栈共享一个一维数组空间
//共享栈的定义
typedef struct {
ElemType data[MAX];
int top1;
int top2;
}ShStack;
//共享栈的初始化
void InitStack(ShStack S)
{
S.top1 = MAX;
S.top2 = -1;
}
共享栈是为了更有效的利用存储空间,两个栈的空间相互调节,只有在整个存储空间被占满时才发生上溢。其存取数据的时间复杂度均为O(1) 。
3.1.3 栈的链式存储结构
链栈的优点是便于多个栈共享存储空间和提高效率。通常采用单链表实现,并规定所有操作都是在但链表的表头进行的。因而规定链栈没有头结点,Head指向栈顶元素。
//链的栈式存储结构
typedef struct Linknode {
ElemType data;
struct Linknode* next;
}* LiStack;
1.链栈的初始化
//链栈的初始化
void InitListack(LiStack& S)
{
S = (Linknode*)malloc(sizeof(Linknode));
S->next = NULL;
}
2.链栈的入栈操作(带头结点)
//链栈入栈
LiStack push_listack(LiStack& Head,ElemType e)
{
Linknode* s;
InitListack(s);
s->data = e;
s->next = Head->next;
Head->next = s;
return Head;
}