栈(stack)-链式存储结构
简称为栈链
栈顶放在单链表的头部,用作插入和删除操作,栈链不存在栈满情况。
栈结构
//栈的链式存储结构
typedef int ElemType;
//链栈中的节点
typedef struct _StackNode {
ElemType data; //节点数据
_StackNode* next; //节点指针
}StackNode, *LinkStackPtr;
//链栈
typedef struct LinkStack {
LinkStackPtr top; //栈顶结点
int count; //节点个数
}LinkStack;
初始化栈
代码如下:
//初始化栈
void InitStack(LinkStack *p)
{
p->top = NULL;
p->count = 0; //节点个数为0
}
进栈
代码如下:
//进栈操作 栈p 进栈的数据e
void pushStack(LinkStack *p, ElemType e)
{
StackNode* node = (StackNode*)malloc(sizeof(StackNode));//创建新的节点
node->data = e; //节点的数据
node->next = p->top;//新节点的next指向当前的栈顶节点
p->top = node; //新的节点变成栈顶
p->count++; //节点个数加1
}
出栈
代码如下:
//出栈操作
void popStack(LinkStack *p)
{
LinkStackPtr temp = (LinkStackPtr)malloc(sizeof(LinkStackPtr));
temp = p->top; //记录栈顶节点
p->top = p->top->next; //改变为新栈顶
p->count--; //栈内节点个数-1
free(temp); //释放旧的栈顶
}
打印栈
//遍历栈
void printStack(LinkStack *p)
{
StackNode *pTemp = p->top; //pTemp指向节点
for (int i = 0; i < p->count; i++)
{
printf("%d\n", pTemp->data); //打印栈顶的节点数据
pTemp = pTemp->next; //栈顶移动到下一个节点
}
}
main函数测试
int main()
{
//生成栈的链表
LinkStack *p = NULL;
p = (LinkStack*)malloc(sizeof(LinkStack));
//初始化栈
InitStack(p);
//进栈操作
pushStack(p, 1);
pushStack(p, 2);
pushStack(p, 3);
pushStack(p, 4);
pushStack(p, 5);
//出栈操作
popStack(p);
//遍历栈
printStack(p);
}