#include <stdio.h>
#include <malloc.h>
#define ElemType char//相当于ElemType等同于char类型
//链式结构 =数据域+指针域
typedef struct LinkStackNode//定义一个链栈的结构体类型
{ElemType data;//ElemType是链栈的元素类型,代表数据域struct LinkStackNode* next;//代表指针域
}LinkStackNode;typedef struct LinkStack//代表链栈的头结点
{LinkStackNode* head;
}LinkStack;
//判断链栈是否为空
int StackEmpty(LinkStack* s)
{ if (s->head == NULL)return 1;elsereturn 0;
}
//链栈的初始化
void InitStack(LinkStack* s)
{s->head = NULL;
}
//链栈进栈操作
void Push(LinkStack* s, ElemType x)
{LinkStackNode* p;p = (LinkStackNode*)malloc(sizeof(LinkStackNode));//为这个链栈申请内存p->data = x;//将数据x放入链栈中p->next = s->head;//指向下一个指针域s->head = p;
}
//链栈出栈操作
void Pop(LinkStack* s)
{if (StackEmpty(s))//表示这个链栈是空栈{printf("栈空");}LinkStackNode* p = s->head;s->head = p->next;
}
//遍历打印链栈
void printLinkStack(LinkStack* s)
{LinkStackNode* p = s->head;while (p != NULL){printf("%c ", p->data);//因为前面是char类型,所以这用%cp = p->next;//指向下一个数据域}printf("\n");
}//栈顶操作
int GetTop(LinkStack*s)
{if (StackEmpty(s))//表示这个链栈是空栈{printf("栈空");return 0;}return s->head->data;//s->head->data就是栈顶元素
}
//求链栈长度
int Getlength(LinkStack* s)
{int length = 0;//先赋初值LinkStackNode* p = s->head;while (p != NULL)//链栈不为空,遍历循环整个链栈{length++;p = p->next;//指向下一个数据域}return length;
}
int main()
{ElemType e;LinkStack s;InitStack(&s);printf("栈%s\n", (StackEmpty(&s) == 1 ? "空" : "不空"));printf("a进栈\n");Push(&s,'a');printf("b进栈\n");Push(&s,'b');printf("c进栈\n");Push(&s,'c');printf("d进栈\n");Push(&s,'d');printf("打印当前链栈里面的元素:\n");printLinkStack(&s);printf("进行出栈操作:\n");Pop(&s);printLinkStack(&s);printf("栈顶的元素为%c", GetTop(&s));printf("\n");printf("此时链栈的长度为:%d", Getlength(&s));return 0;
}
运行结果: