/**
* 实验题目:
* 实现链栈各种基本运算的算法
* 实验内容:
* 编写程序,实现链栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能:
* (1)初始化链栈s
* (2)判断链栈s是否非空
* (3)依次进链栈元素a,b,c,d,e
* (4)判断链栈s是否非空
* (5)输出链栈长度
* (6)输出从栈顶到栈底元素
* (7)输出链栈序列
* (8)判断链栈s是否非空
* (9)释放链栈
*/
#include <stdio.h>
#include <malloc.h>
typedef char ElemType;
typedef struct linknode
{
ElemType data; // 数据域
struct linknode *next; // 指针域
}LiStack;
/*--------------------------初始化栈s---------------------------*/
void InitStack(LiStack *&s) // 指针的引用
{
s = (LiStack *)malloc(sizeof(LiStack));
s->next = NULL;
}
/*--------------------------释放栈s---------------------------*/
void ClearStack(LiStack *&s)
{
LiStack *p = s->next;
while(p != NULL)
{
free(s);
s = p;
p = p->next;
}
}
/*--------------------------求栈s的长度---------------------------*/
int StackLength(LiStack *s)
{
int i = 0;
LiStack *p;
p = s->next;
while(p != NULL)
{
i++;
p = p->next;
}
return i;
}
/*--------------------------判断栈s是否为空栈---------------------------*/
int StackEmpty(LiStack *s)
{
return (s->next == NULL);
}
/*--------------------------进栈元素e---------------------------*/
void Push(LiStack *&s, ElemType e)
{
LiStack *p;
p = (LiStack *)malloc(sizeof(LiStack));
p->data = e;
p->next = s->next;
s->next = p;
}
/*--------------------------出栈一个元素---------------------------*/
int Pop(LiStack *&s, ElemType &e)
{
LiStack *p;
if(s->next == NULL) // 栈空的情况
return 0;
p = s->next; // p指向第一个数据结点
e = p->data;
s->next = p->next;
free(p);
return 1;
}
/*--------------------------取栈顶元素---------------------------*/
int GetTop(LiStack *s, ElemType &e)
{
if(s->next == NULL) // 栈空的情况
return 0;
e = s->next->data;
return 1;
}
/*--------------------------从栈顶到栈底输出元素---------------------------*/
void DispStack(LiStack *s)
{
LiStack *p = s->next;
while(p != NULL)
{
printf("%c ", p->data);
p = p->next;
}
printf("\n");
}
int main(void)
{
ElemType e;
LiStack *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");
ClearStack(s);
return 0;
}
测试结果:
(1)初始化链栈s
(2)链栈为空
(3)依次进链栈元素a,b,c,d,e
(4)链栈为非空
(5)链栈长度:5
(6)从链栈顶到链栈底元素:e d c b a
(7)出链栈序列:e d c b a
(8)链栈为空
(9)释放链栈