问题描述及代码
/*
*烟台大学计控学院
*作 者:张雯婧
*完成日期:2016年9月25日
*问题描述:定义链栈存储结构,实现其基本运算,并完成测试。
要求:
1、头文件listack.h中定义数据结构并声明用于完成基本运算的函数。对应基本运算的函数包括:
void InitStack(LiStack *&s); //初始化栈
void DestroyStack(LiStack *&s); //销毁栈
bool StackEmpty(LiStack *s); //栈是否为空
int StackLength(LiStack *s); //返回栈中元素个数——栈长度
bool Push(LiStack *&s,ElemType e); //入栈
bool Pop(LiStack *&s,ElemType &e); //出栈
bool GetTop(LiStack *s,ElemType &e); //取栈顶数据元素
void DispStack(LiStack *s); //输出栈1
2、在Listack.cpp中实现这些函数
3、在main函数中完成测试,包括如下内容:
(1)初始化栈s
(2)判断s栈是否为空
(3)依次进栈元素a,b,c,d,e
(4)判断s栈是否为空
(5)输出栈长度
(6)输出从栈顶到栈底元素
(7)出栈,并输出出栈序列
(8)判断s栈是否为空
(9)释放栈
*/
1.listack.h的代码
typedef char ElemType;
typedef struct linknode
{
Elemtype data;
struct linknode * next;
}LiStack;
void InitStack(LiStack *&s);//初始化栈
void DestroyStack(LiStack *&s); //销毁栈
bool StackEmpty(LiStack *s); //栈是否为空
int StackLength(LiStack *s); //返回栈中元素个数——栈长度
void Push(LiStack *&s,ElemType e); //入栈
bool Pop(LiStack *&s,ElemType &e); //出栈
bool GetTop(LiStack *s,ElemType &e); //取栈顶数据元素
void DispStack(LiStack *s); //输出栈
2.listack.cpp的代码
void InitStack(LiStack *&s)//初始化栈
{
s=(LiStack *)malloc(sizeof (LiStack));
s->next=NULL;
}
void DestroyStack(LiStack *&s) //销毁栈
{
LiStack *p=s,*q=s->next;
if(q!=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p);
}
bool StackEmpty(LiStack *s) //栈是否为空
{
return (s->next==NULL);
}
int StackLength(LiStack *s) //返回栈中元素个数——栈长度
{
LiStack *p=s->next;
int i;
if(p!=NULL)
{
i++;
p=p->next;
}
return(i);
}
void Push(LiStack *&s,ElemType e) //入栈
{
LiStack *p;
p=(LiStack *)malloc(sizeof (LiStack));
p->data=e;
p->next=s->next;
s->next=p;
}
bool Pop(LiStack *&s,ElemType &e) //出栈
{
LiStack *p;
if(s->next==NULL)
return false;
p=s->next;
s->next=p->next;
free(p);
return true;
}
bool GetTop(LiStack *s,ElemType &e) //取栈顶数据元素
{
if(s->next==NULL)
return false;
e=s->next->data;
return true;
}
void DispStack(LiStack *s) //输出栈
{
LiStack *p=s->next;
if(p!=NULL)
{
printf("%c ",p->data);
p=p->next;
}
printf("\n");
}
3.main.cpp的代码
int main()
{
ElemType e;
SqStack *s;
printf("(1)初始化栈s\n");
InitStack(s);
printf("(2)栈为%s\n",(StackEmpty(s)?"空":"非空"));
printf("(3)依次进栈元素a,b,c,d,e\n");
Push(s,'a');
Push(s,'b');
Push(s,'c');
Push(s,'d');
Push(s,'e');
printf("(4)栈为%s\n",(StackEmpty(s)?"空":"非空"));
printf("(5)栈长度:%d\n",StackLength(s));
printf("(6)从栈顶到栈底元素:");DispStack(s);
printf("(7)出栈序列:");
while (!StackEmpty(s))
{
Pop(s,e);
printf("%c ",e);
}
printf("\n");
printf("(8)栈为%s\n",(StackEmpty(s)?"空":"非空"));
printf("(9)释放栈\n");
DestroyStack(s);
return 0;
}
运行结果:
知识点总结:
定义了链栈的存储结构,并实现了其基本运算。
学习心得:
利用链栈的存取结构与单链表的实现基本相同。