链栈
链栈即以链式结构存储的栈,与链表相似,但具有栈的运算规则。
其结构如下所示:
链栈一般用一个头指针结构top来表示,它指向栈顶元素,对于链表来说,top结构相当于它的头指针head。
下面是链栈的实现及相关运算函数:
#include <stdio.h>
#include <stdlib.h>
#define Datatype int
//栈节点定义
typedef struct Lstack{
Datatype data;
struct Lstack *next;
}StackNode;
//栈顶指针定义,存储指向StackNode节点的指针的一种类型
typedef struct{
StackNode *top;
}StackTop; //类似于链表的头指针head;
//置栈空
void InitStack(StackTop *S)
{
S->top = NULL;
}
//判断栈是否为空
int StackEmpty(StackTop *S)
{
return(S->top == NULL);
}
//数据v压入栈
void Push(StackTop *S, Datatype v)
{
StackNode *p;
p = (StackNode *)malloc(sizeof(StackNode));//分配新的空间
p->data = v;
p->next = S->top;
S->top = p;
}
//弹出栈顶数据
Datatype Pop(StackTop *S)
{
Datatype i;
StackNode *p;
if(StackEmpty(S))
printf("Error, the stack is empty!");
p = S->top;
i = S->top->data;
S->top = S->top->next;
free(p);
return i;
}
//读取栈顶数据,不改变栈
Datatype StackPop(StackTop *S)
{
Datatype i;
if(StackEmpty(S))
printf("Error, the stack is empty!");
i = S->top->data;
return i;
}
void main()
{
StackTop St; //这里为链栈的声明和初始化,不能声明为指针,不然程序无法自动分配内存空间
Datatype i=1;
InitStack(&St);
while(i<=6)
{
Push(&St,i);
i++;
}
printf("The top number of the stack is : %d \n",Pop(&St));
printf("The top number of the stack is : %d \n",Pop(&St));
printf("The top number of the stack is : %d \n",StackPop(&St));
printf("The top number of the stack is : %d \n",StackPop(&St));
}
通过上面的入栈出栈测试,输出结果为6,5, 4, 4,可以看出Pop( )会改变链栈的top,而Stacktop( )不会。