//库函数头文件包含
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
//函数状态码定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int SElemType;
//----------栈的链式存储表示----------------
typedef struct StackNode{
SElemType data;
struct StackNode *next;
}StackNode;
typedef struct {
StackNode *top;
}LinkStack;
//初始化一个空栈
Status InitLStack(LinkStack &LS){
LS.top = (StackNode *)malloc(sizeof(StackNode));
if(!LS.top)
exit(OVERFLOW);
LS.top->next = NULL;
return OK;
}
//销毁栈
Status DestoryLStack(LinkStack &LS){
StackNode *p, *q;
p = LS.top;
while(p){
q = p;
p = p->next;
free(q);
}
return OK;
}
//清空栈
Status ClearLStack(LinkStack &LS){
StackNode *p, *q;
p = LS.top->next;
LS.top->next = NULL;
while(!p){
q = p;
p = p->next;
free(q);
}
return OK;
}
//判断栈是否为空
bool Is_LStackEmpty(LinkStack LS){
if(!LS.top->next)
return true;
return false;
}
//返回栈顶元素
SElemType GetTop(LinkStack LS){
if(LS.top->next)
return LS.top->next->data;
return ERROR;
}
//入栈
Status PushLStack(LinkStack &LS, SElemType e){
StackNode *InsertPtr;
InsertPtr = (StackNode *)malloc(sizeof(StackNode));
if(!InsertPtr)
exit(OVERFLOW); //储存分配失败
InsertPtr->data = e;
InsertPtr->next = LS.top->next;
LS.top->next = InsertPtr;
return OK;
}
//出栈
Status PopLStack(LinkStack &LS, SElemType &e){
StackNode *DelPtr;
if(!LS.top->next)
return ERROR;
DelPtr = LS.top->next;
e = DelPtr->data;
LS.top->next = DelPtr->next;
free(DelPtr);
return OK;
}
//返回栈长
int LStackLength(LinkStack LS){
StackNode *p;
int len = 0;
p = LS.top->next;
while(p){
len++;
p = p->next;
}
return len;
}
//visit()函数
Status Print(SElemType e){
printf("%d ", e);
return OK;
}
//遍历栈
Status LStackTraverse(LinkStack LS, Status (*visit)(SElemType)){
StackNode *p;
p = LS.top->next;
while(p){
if(!visit(p->data))
return ERROR;
p = p->next;
}
return OK;
}
//主函数
int main(){
LinkStack S;
SElemType a;
InitLStack(S);
printf("输入5个数字:\n");
for(int i = 0; i < 5; i++){
scanf("%d", &a);
PushLStack(S, a);
}
printf("下面是执行遍历操作的输出结果:\n");
LStackTraverse(S, Print);
printf("\n下面是返回栈长的结果:\n");
printf("%d\n", LStackLength(S));
printf("下面是执行出栈后遍历的结果:\n");
PopLStack(S, a);
LStackTraverse(S, Print);
printf("\n下面是获得栈顶元素的操作:\n%d\n", GetTop(S));
printf("下面是判断栈是否为空的操作(空输出YES,不空输出NO和栈长):\n");
if(Is_LStackEmpty(S))
printf("YES");
else
printf("NO %d", LStackLength(S));
return 0;
}
下面是对程序的简单测试结果: