栈-链式存储结构

栈(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);
}

猜你喜欢

转载自blog.csdn.net/weixin_43340991/article/details/86377515