#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef int Status;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef struct StackNode
{
ElemType data;
struct StackNode *next;
}StackNode,*LinkStackPtr;
typedef struct LinkStack
{
LinkStackPtr top;
int count;
}LinkStack;//这个结构体必须在StackNode结构体定义之后
/* 构造一个空栈S */
Status InitStack(LinkStack *s)
{
/*s=(LinkStack*)malloc(sizeof(LinkStack));
s->count=0;
s->top=(LinkStackPtr)malloc(sizeof(StackNode));
s->top->next=NULL;
return OK;*///错误
s->top = (LinkStackPtr)malloc(sizeof(StackNode));
if(!s->top)
return ERROR;
s->top=NULL;
s->count=0;
return OK;
}
Status visit(ElemType e)
{
printf("%d ",e);
return OK;
}
Status StackTraverse(LinkStack s)
{
LinkStackPtr p=s.top;
while(p)
{
visit(p->data);
p=p->next;
}
printf("\n");
return OK;
}
/* 插入元素e为新的栈顶元素 */
Status Push(LinkStack *s,int e)
{
LinkStackPtr q=(LinkStackPtr)malloc(sizeof(StackNode));
q->data=e;
q->next=s->top;
s->top=q;
s->count++;
return OK;
}
/* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
//Status Pop(LinkStack *S,ElemType *e)
//{
// LinkStackPtr p;
// if(StackEmpty(*S))
// return ERROR;
// *e=S->top->data;
// p=S->top; /* 将栈顶结点赋值给p,见图中③ */
// S->top=S->top->next; /* 使得栈顶指针下移一位,指向后一结点,见图中④ */
// free(p); /* 释放结点p */
// S->count--;
// return OK;
//}
Status Pop(LinkStack *s,int *e)
{
LinkStackPtr p=s->top;
*e=s->top->data;
s->top=s->top->next;
free(p);
return OK;
}
/* 若栈S为空栈,则返回TRUE,否则返回FALSE */
//Status StackEmpty(LinkStack S)
//{
// if (S.count==0)
// return TRUE;
// else
// return FALSE;
Status StackEmpty(LinkStack s)
{
if(!s.top)
return OK;
else
return ERROR;
}
/* 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR */
Status GetTop(LinkStack s,int *e)
{
if(!s.top)
return ERROR;
*e=s.top->data;
return OK;
}
/* 返回S的元素个数,即栈的长度 */
//int StackLength(LinkStack S)
//{
// return S.count;
//}
Status StackLength(LinkStack s)
{
int num=0;
LinkStackPtr p=s.top;
while(p)
{
num++;
p=p->next;
}
return num;
}
/* 把S置为空栈 */
//Status ClearStack(LinkStack *S)
//{
// LinkStackPtr p,q;
// p=S->top;
// while(p)
// {
// q=p;
// p=p->next;
// free(q);
// }
// S->count=0;
// return OK;
//}
Status ClearStack(LinkStack *s)
{
LinkStackPtr p=s->top,q;
while(p)
{
q=p;
p=p->next;
free(q);
}
free(p);
s->top=NULL;
return OK;
}
int main()
{
int j;
LinkStack s;
int e;
if(InitStack(&s)==OK)
for(j=1;j<=10;j++)
Push(&s,j);
printf("栈中元素依次为:");
StackTraverse(s);
printf("栈的长度为%d\n",StackLength(s));
Pop(&s,&e);
printf("弹出的栈顶元素 e=%d\n",e);
printf("栈空否:%d(1:空 0:否)\n",StackEmpty(s));
GetTop(s,&e);
printf("栈顶元素 e=%d 栈的长度为%d\n",e,StackLength(s));
ClearStack(&s);
printf("清空栈后,栈空否:%d(1:空 0:否)\n",StackEmpty(s));
system("pause");
return 0;
}
输出结果:
本文介绍了一种使用链表实现的栈数据结构,并通过具体的C语言代码展示了如何进行初始化、元素的压栈与出栈操作、遍历栈内元素、判断栈是否为空以及获取栈顶元素等功能。

被折叠的 条评论
为什么被折叠?



