3.1 栈
3.1.1 栈的定义
3.1.2 栈的顺序存储结构及其基本运算实现
假设栈的元素个数最大不超过正整数MaxSize,所有的元素都具有同一数据类型 ElemType ,则可用下列方式来声明顺序栈类型 SqStack:
typedef struct{
ElemType date[MaxSize]; // 存放栈中的数据元素
int top; // 栈顶指针,即存放栈顶元素data在数组中的下标
}SqStack; // 顺序栈类型
顺序栈的基本运算算法
1)初始化栈:InitStack(&s)
void InitStack(SqStack *&s){
s=(SqStack *)malloc(sizeof(SqStack)); //分配一个顺序栈空间,首地址存放在s中
s->top=-1; //栈顶指针置为-1
}
2)销毁栈:DestoryStack(&s)
void DestoryStack(SqStack *&s){
free(s);
}
3)判断栈是否为空:StackEmpty(s)
bool StackEmpty(SqStack *s){
return (s->top==-1);
}
4)进栈:Push(&s,e)
bool Push(SqStack *&s,ElemType e){
if(s->top==MaxSize-1) //栈满的情况,即栈上溢出
return false;
s->top++; //栈顶指针增
s->date[s->top]=e; //元素e放在栈顶指针处
return true;
}
5)出栈:Pop(&s,&e)
bool Pop(SqStack *&s,ElemType &e){
if(s->top==-1) //栈为空的情况,即栈下溢出
return false;
e=s->date[s->top]; //取栈顶元素
s->top--; //栈顶指针减1
return true;
}
6)取栈顶元素:GetTop(s,&e)
bool GetTop(SqStack *s,ElemType &e){
if(s->top==-1) //栈为空的情况,即栈下溢出
return false;
e=s->date[s->top]; //取栈顶元素
return true;
}
3.1.3 栈的链式存储结构及其基本运算的实现
链栈中数据结点的类型 LinkStNode 声明如下 :
typedef struct linknode{
ElemType data;
struct linknode * next;
}LinkStNode;
链栈的基本运算算法
1)初始化栈:InitStack(&s)
void InitStack(LinkStNode *&s){
s = (LinkStNode *)malloc(sizeof(LinkStNode));
s->next = NULL;
}
2)销毁栈:DestoryStack(&s)
void DestoryStack(LinkStNode *&s){
LinkStNode *pre = s,*p = s->next; // pre 指向头结点,p 指向首结点
while(p != NULL){ // 循环到 p 为空
free(pre); // 释放 pre 结点
pre = p; // pre、p同步后移
p = pre->next;
}
free(pre);
}
3)判断栈是否为空:StackEmpty(s)
bool StackEmpty(LinkStNode *s){
return (s->next == NULL);
}