//定义头文件
#include<stdio.h>
#include<malloc.h>
//定义元素类型
typedef char ElemType;
//定义链栈结点类型
typedef struct linknode
{
ElemType data;
struct linknode* next;
}LinkStNode;
//初始化链栈
int InitStack(LinkStNode*& s)
{
//创建头结点
s = (LinkStNode*)malloc(sizeof(LinkStNode));
s->next = NULL;
}
//销毁栈
void ClearStack(LinkStNode*& s)
{
//P指向栈顶元素
LinkStNode* pre = s, * p = s->next;
//循环到p为空
while (p != NULL)
{ //释放头结点
free(pre);
// P指针后移
pre = p;
p = pre->next;
//此时pre指向尾结点,释放其空间
free(pre);
}
}
//求栈的长度
int StackLength(LinkStNode* s)
{ //P指向栈顶元素
LinkStNode* p = s->next;
int n;
while (p != NULL)
{ //长度加1
n++;
// P指针后移
p->next = p;
}
//返回栈的长度
return(n);
}
//判断栈是否为空
int StackEmpty(LinkStNode* s)
{
return(s->next == NULL);
}
//进栈
void Push(LinkStNode*& s, ElemType e)
{
//创建结点p
LinkStNode* p;
p = (LinkStNode*)malloc(sizeof(LinkStNode));
// 给P数据域赋值
p->data = e;
//插入*p结点,使P作为第一个数据结点
p->next = s->next;
s->next = p;
}
//出栈
int Pop(LinkStNode*& s, ElemType& e)
{
LinkStNode* p;
//栈空的情况
if (s->next == NULL)
return false;
//p指向第一个数据结点
p = s->next;
//保存出栈节点p的数据
e = p->data;
//删除p节点
s->next = p->next;
//释放p节点
free(p);
return 1;
}
//输出链栈
void DispStack(LinkStNode* s)
{
LinkStNode* p;
//p指向第一个数据结点
p = s->next;
while (p != NULL)
{
//输出P结点的数据
printf("%c", p->data);
//p后移
p->next = p;
}
printf("\n");
}
int main()
{
LinkStNode* s;
ElemType e, a;
int i;
//调用InitStack()初始化栈
printf("<1>初始化链栈\n");
InitStack(s);
printf("初始化链栈成功!\n");
//调用StackEmpty()判断链栈是否为空
printf("<2>栈为%s\n", (StackEmpty(s) ? "空" : "非空"));
printf("<3>请输入%d个进栈元素:\n", 10);
for (i = 0; i < 10; i++)
{
scanf("%c", &a);
//调用Push()进栈
Push(s, a);
}
//调用DispStack()输出栈
DispStack(s);
//调用StackEmpty()判断链栈是否为空
printf("<4>栈为%s\n", (StackEmpty(s) ? "空" : "非空"));
//调用StackLength()求链栈长度
StackLength(s);
printf("<5>出栈序列:");
//调用Pop()使栈中元素出栈
while (!StackEmpty(s))
{
Pop(s, e);
printf("%c", e);
}
printf("\n");
printf("<6>栈为%s\n", StackEmpty(s) ? "空" : "非空");
printf("释放栈\n");
ClearStack(s);
return 1;
}
运行错误显示,忽略scanf返回值