一.栈的定义:(LIFO)
只允许在一端进行插入或删除操作的线性表。
空栈:空的
栈顶:允许插入和删除的一端。(栈顶元素)
栈底:不允许插入和删除的一端。(栈底元素)
二.顺序栈的定义:
//定义一个顺序栈
#define MaxSize 10 //定义栈中元素最大个数
typedef struct{
ElemType data[MaxSize]; //静态数组存放栈中元素
int top; //栈顶指针(数组下标}
}SqStack;
int main(){
SqStack S;
return 0;
}
//初始化一个栈
void InitStack(SqStack &S){
S.top=-1; //初始化栈顶指针
}
//判断栈是否为空
bool EmptyStack(SqStack S){
return S.top==-1;
}
三.进栈操作:
增加新元素
bool Push(SqStack &S,int e){
if(S.top==MaxSize-1}
return false;
S.top++;
S.data[S.top]=x;
return true;
}
四.出栈操作:
删除元素
//删除栈顶元素
bool Pop(SqStack &S,int &e){
if(S.top==-1} //判断栈是否为空
return false;
e=S.data[S.top]; //栈顶元素先出栈
S.top--; //指针减一
return true;
五.读栈顶元素:
和出栈操作类似,但是不用top指针不用减减。
bool GetTop(SqStack S,int &e){
if(S.top==-1)
return false;
e=S.data[S.top];
return true;
}
顺序栈也有很大缺点,不能改变栈的大小。
六.共享栈:
定义两个指针,分别指向栈顶和栈底。
#define MaxSize 10
typedef struct{
int data[MaxSize]; //静态数组存放栈中元素
int top0; //0号栈栈顶指针
int top1; //1号栈栈顶指针
}ShStack;
//初始化一个栈
void InitStack(ShStack &S){
S.top0=-1;
S.top1=MaxSize; //这是top指针初始值是0
}
判断栈满条件:top0+1=top1
七.链栈的定义:
和单链表一样,
typedef struct Linknode{
int x; //数据域
struct Linknode *next; //指针域
}*LiStack; //栈类型
增删查改和单链表相似。