实验内容:编写一个程序listack.cpp (或.c),实现链栈的各种基本运算(假设栈中元素类型SElemType为char),并在此基础上设计一个程序exp3-2.cpp (或.c)完成以下功能。
(1) 初始化栈S。
(2) 判断栈是否为空。
(3) 将元素a、b、c、d、e依次进栈。
(4) 输出栈顶元素。
(5) 输出栈的长度。
(6) 将栈中元素依次出栈并输出。
(7) 判断栈是否为空。
(8) 销毁栈。
//listack.cpp
#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
typedef char ElemType;
typedef int Status;
typedef struct linknode
{
ElemType data; //数据域
struct linknode *next; //指针域
} LiStack;
//初始化栈s
Status InitStack(LiStack *s)
{
s = (LiStack *)malloc(sizeof(LiStack));
s->next = NULL;
return OK;
}
//销毁栈
Status DestroyStack(LiStack *s)
{
LiStack *p = s, *q = s->next;
while (q != NULL)
{
free(p);
p = q;
q = p->next;
}
free(p); //此时p指向尾节点,释放其空间
return OK;
}
//判断栈是否为空
Status StackEmpty(LiStack *s)
{
if (s->next == NULL)
{
/* code */
return ERROR;
}else{
return OK;
}
}
//进栈
Status Push(LiStack *s, ElemType e)
{
LiStack *p;
p = (LiStack *)malloc(sizeof(LiStack));
p->data = e; //新建元素e对应的节点*p
p->next = s->next; //插入*p节点作为开始节点
s->next = p;
return OK;
}
Status Pop(LiStack *s, ElemType *e) //出栈
{
LiStack *p;
if (s->next == NULL) //栈空的情况
return ERROR;
p = s->next; //p指向开始节点
*e = p->data;
s->next = p->next; //删除*p节点
free(p); //释放*p节点
return OK;
}
Status GetTop(LiStack *s, ElemType *e) //取栈顶元素
{
if (s->next == NULL) //栈空的情况
return ERROR;
*e = s->next->data;
return OK;
}
//求栈的长度
Status LinkStackLength(LiStack *S)
{
int count = 0;
while (S->next != NULL) {
++count;
S= S->next;
}
return count;
}
int main()
{
int length;
ElemType e;
LiStack *s;
printf("1.初始化栈链s\n");
InitStack(s);
printf("2.链栈为:%s\n", ((StackEmpty(*&s)==0)? "空" : "非空"));
printf("3.依次进链栈的元素为:a,b,c,d,e\n");
Push(s, 'a');
Push(s, 'b');
Push(s, 'c');
Push(s, 'd');
Push(s, 'e');
Pop(s, &e);
printf("4.输出链栈S栈顶元素为: %c", e);
printf("\n");
length = LinkStackLength(s);
printf("5.输出链栈S的长度:%d", length);
printf("\n");
printf("6.将栈中元素依次出栈并输出:");
while (StackEmpty(s))//栈不为空,输出栈的所有元素
{
Pop(s, &e);
printf("%c ", e);
}
printf("\n");
printf("7.链栈为: %s\n", (StackEmpty(s) ? "空" : "非空"));
printf("8.销毁链栈\n");
DestroyStack(s);
return 0;
}
运行结果: