链栈的基本操作主要包含四个操作:初始化、入栈、出栈、取栈顶元素。具体代码如下:
在初始化之前,先进行预定义:
#define ERROR 0
typedef int ElemType;
typedef struct StackNode{
ElemType data;
StackNode *next;
}StackNode,*LinkStack;
初始化:
StackNode *InitStack(LinkStack S)
{
S = NULL;
return S;
}
初始化的主要目的是构造一个空栈,并使栈顶指针置空,返回栈顶地址。
入栈:
StackNode *Push(LinkStack S, ElemTypee)
{
LinkStack p;
p = (StackNode *)malloc(sizeof(StackNode));
p->data = e;
p->next = S;
S = p;
return S;
}
声明指针p并为指针p分配内存空间,然后将传入e的值赋值给p指针的data域,将S的地址赋值给p的指针域,最后让S移动到p的位置(栈顶)。返回栈顶地址。
出栈:
StackNode *Pop(LinkStack S, ElemType*e)
{
LinkStack p;
p = S;
if (!S)
return ERROR;
*e = S->data;
S = S->next;
free(p);
return S;
}
先将栈顶地址赋值给p,并判断是否为空栈。将出栈的元素值保存在*e中,并让栈顶指针S下移一位,释放栈顶p,返回栈顶地址S。
取栈顶元素:
ElemType GetTop(LinkStack S)
{
if (!S)
return ERROR;
return S->data;
}
判断栈是否为空,如果不为空,返回栈顶值。
加入main()测试:
int main(void)
{
int n;
StackNode S, *p1;
ElemType e, *p;
p = &e;
p1 = &S;
printf("1.初始化\n2.入栈\n3.出栈\n4.取栈顶元素\n5.退出\n");
while (1)
{
printf("请选择:");
scanf("%d", &n);
switch (n)
{
case 1:
if (!(p1 = InitStack(p1)))
printf("初始化成功!\n");
else
printf("初始化失败!\n");
break;
case 2:
printf("输入你要入栈的元素:");
scanf("%d", &e);
if (p1 = Push(p1, e))
printf("入栈成功!\n");
else
printf("入栈失败!\n");
break;
case 3:
p1 = Pop(p1, p);
printf("%d已经出栈\n", *p);
break;
case 4:
printf("栈顶元素为:%d\n", GetTop(p1));
break;
case 5:
exit(0);
}
}
return 0;
}