【数据结构学习笔记】3.1栈(Stack)
1.栈的定义
-
只允许在一端进行插入或删除操作的线性表
-
特点:后进先出-Last In First Out(LIFO)
-
n个不同元素进栈,出栈元素不同排列的个数为
2.顺序栈的定义和初始化操作
#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;
}
3.进栈操作
bool Push(SqStack &S,ElemType x){
if(S.top==MaxSize-1)
return false;
S.top=S.top+1;
S.data[S.top]=x;
return true;
}
-
S.top=S.top+1;
S.data[S.top]=x;
可以等价为: S.data[++S.top]=x;
4.出栈操作
bool Pop(SqStack &S,ElemType &x){
if(S.top==-1)
return false;
x=S.data[S.top];
S.top=S.top-1;
return true;
}
-
x=S.data[S.top];
S.top=S.top-1;
可以等价为:x=S.data[S.top--];
5.读取栈顶元素
bool GetTop(SqStack S,ElemType &x){
if(S.top==-1)
return false;
x=S.data[S.top];
return true;
}
6.栈初始化及操作的另一种方式
void InitStack(SqStack &S){
S.top=0;
}
bool StackEmpty(SqStack S){
if(S.top==0)
return true;
else
return false;
}
bool Push(SqStack &S,ElemType x){
if(S.top==MaxSize-1)
return false;
S.data[S.top]=x;
S.top=S.top+1;
return true;
}
bool Pop(SqStack &S,ElemType &x){
if(S.top==-1)
return false;
S.top=S.top-1;
x=S.data[S.top];
return true;
}
-
S.data[S.top]=x;
S.top=S.top+1;
可以等价为: S.data[S.top++]=x; //入栈操作
-
S.top=S.top-1;
x=S.data[S.top];
可以等价为:x=S.data[--S.top];
-
以上创、增、删、查时间复杂度均为:O(1)
7.共享栈
#define MaxSize 10
typedef struct{
ElemType data[MaxSize];
int top0;
int top1;
}SqStack;
void InitStack(ShStack &S){
S.top0=-1;
S.top1=MaxSize;
}
top0+1==top1;

顺序栈与共享栈