问题代码:
/*
copyright (t) 2016,烟台大学计算机学院
*All rights reserved.
*文件名称:1.cpp
*作者:李玲
*完成日期:2016年9月29日
*版本号:v1.0
*问题描述:定义顺序栈存储结构,实现其基本运算,并完成测试。
*输入描述:无
*程序输出:顺序栈基本运算的实现结果
*/
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); //输出栈
listack.cpp:
#include <stdio.h>
#include <malloc.h>
#include "listack.h"
void InitStack(LiStack *&s) //初始化栈
{
s=(LiStack *)malloc(sizeof(LiStack));
s->next=NULL;
}
void DestroyStack(LiStack *&s) //销毁栈
{
LiStack *pre=s,*p=s->next;
while(p!=NULL)
{
free(pre);
pre=p;
p=p->next;
}
free(p);
}
bool StackEmpty(LiStack *s) //栈是否为空
{
return (s->next==NULL);
}
int StackLength(LiStack *s) //返回栈中元素个数——栈长度
{
int len=0; //初始长度置0
LiStack *p=s->next;
while(p!=NULL)
{
len++;
p=p->next;
}
return len;
}
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;
e=p->data;
s->next=p->next;
printf("%c ",e);
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; //p指向s中第一个数据元素
while(p!=NULL)
{
printf("%c ",p->data);
p=p->next;
}
printf("\n");
}
main.cpp:
#include <stdio.h>
#include "listack.h"
int main()
{
LiStack *s;
Elemtype e;
InitStack(s); //初始化栈s
if(StackEmpty(s)) //判断s栈是否为空
printf("该栈是空栈\n");
else
printf("该栈不是空栈\n");
Push(s,'a'); //a元素进栈
Push(s,'b'); //b元素进栈
Push(s,'c'); //c元素进栈
Push(s,'d'); //d元素进栈
Push(s,'e'); //e元素进栈
if(StackEmpty(s)) //判断s栈是否为空
printf("该栈是空栈\n");
else
printf("该栈不是空栈\n");
printf("栈长度为:%d\n",StackLength(s)); //输出栈长度
printf("从栈顶元素到栈底元素的输出序列为:\n");
DispStack(s); //输出从栈顶到栈底元素
if(StackEmpty(s)) //判断s栈是否为空
printf("该栈是空栈\n");
else
printf("该栈不是空栈\n");
printf("出栈序列为:\n"); //出栈,并输出出栈序列
while (!StackEmpty(s)) //栈不为空时输出出栈元素
Pop(s,e);
printf("\n");
DestroyStack(s); //销毁(释放)栈
printf("此栈已被销毁!\n");
return 0;
}
运行结果:
知识点总结:
链栈的基本知识与算法描述
学习心得:
总结了链栈和顺序栈的异同以及算法库的实现。