#25考研数据结构代码实践与回顾
一、定义
typedef struct Linknode{
ElemType data; //数据域
struct Linknode *next; //指针域
}*LiStack, StackNode; //两者等价,前者表示一个链栈,后者表示一个结点
二、初始化
1. 带头结点
void InitStack(LinkStack &S){
S = (StackNode *)malloc(sizeof(stackNode)); //创建头结点
S->next = NULL;
}
2. 不带头结点
void InitStack(LinkStack &S){
S = NULL;
}
三、判空
1. 带头结点
bool stackEmpty(LinkStack S){
return (S->next == NULL);
}
2. 不带头结点
bool stackEmpty(LinkStack S){
return (S == NULL);
}
四、求链栈的长度
1. 带头结点
int stackLength(LinkStack s){
stackNode* p = s->next; //带头结点的链表第一个元素在头结点的下一个结点
int length = 0;
while(p != NULL){
p = p->next;
length++;
}
return length;
}
2. 不带头结点
int stackLength(LinkStack s){
stackNode* p = s;
int length = 0;
while(p != NULL){
p = p->next;
length++;
}
return length;
}
五、新元素入栈
1. 带头结点
bool push(LinkStack &s, ElemType){
stackNode *p = (stackNode *)malloc(sizeof(stackNode));
p->data = x;
p->next = s->next;
s->next = p;
return true;
}
2. 不带头结点
bool push(LinkStack &s, ElemType){
stackNode *p = (stackNode *)malloc(sizeof(stackNode));
p->data = x;
if(s == NULL){ //当链表(栈)为空时
p->next = NULL;
}else{
p->next = s;
}
s = p;
return true;
}
六、元素出栈(通过x返回)
1. 带头结点
bool pop(LinkStack &s, ElemType &x){
if(s->next == NULL) return false; //当链表为空时
stackNode *p = s->next;
x = p->data;
s->next = p->next; //出栈
free(p); //释放空间
return true;
}
2. 不带头结点
bool pop(LinkStack &s, ElemType &x){
if(s == NULL) return false; //当链表为空时
stackNode *p = s;
x = p->data;
s = p->next; //出栈
free(p); //释放空间
return true;
}
七、返回栈顶元素
stackNode* GetTop(LinkStack s){
if(stackEmpty(s)) return NULL; //判空
stackNode* p = (StackNode *)malloc(sizeof(stackNode));
p->data = s->next->data; //带头结点
//不带头结点:p->data = s->data;
p->next = NULL;
return p;
}
八、销毁(不带头结点)
void DestroyStack(LinkStack &s){
stackNode *p;
while(s != NULL){
p = s;
s = s->next;
free(p);
}
s = NULL;
}