数据结构笔记(八)-- 链式栈

链表实现栈

一、链式栈的结构

在这里插入图片描述

二、链式栈的指针指向

链式栈的指针指向栈的顶部
在这里插入图片描述

三、结点和栈的结构定义

在这里插入图片描述

typedef int ElemType;//定义存储的数据类型
typedef struct SNode  //定义链结点结构
{
	ElemType data;
	SNode *next;
}SNode ,*pSNode;
 
typedef struct Stack  //定义栈结构
{
	pSNode pTop;
	pSNode pBottom;
}Stack, *pStack;

三、栈操作定义

//1、初始化栈
void InitStack(pStack S);
//2、压栈
bool Push(pStack S, ElemType e);
//3、判断栈是否为空
bool StackEmpty(pStack S);
//4、出栈出栈的值用e返回
bool pop(pStack S, ElemType &e);
//5、遍历栈
void StackTraverse(pStack S);
//6、清空栈
void StackClear(pStack S);
//7、计算栈的大小
int StackLength(pStack S);

四、操作的实现

1、初始化栈

在这里插入图片描述

void InitStack(pStack S)
{
	pSNode pNewNode = (pSNode)malloc(sizeof(SNode));
	if (pNewNode == NULL)
	{
		printf("动态内存分配失败!程序结束\n");
		exit(-1);
	}
	S->pTop = S->pBottom = pNewNode;// 栈顶和栈底都指向头结点
}

2、压栈

在这里插入图片描述

bool Push(pStack S,ElemType e)
{
	pSNode pNewNode = (pSNode)malloc(sizeof(SNode));//创建新结节点
	if (pNewNode == NULL)
	{
		printf("动态内存分配失败!程序结束\n");
		exit(-1);
	}
	pNewNode->data = e;//新结点赋值
	pNewNode->next = S->pTop;//新结点指向栈顶
	S->pTop = pNewNode;//栈顶指针指向新结点
	return true;
}

3、判断栈是否为空

在这里插入图片描述

bool StackEmpty(pStack S)
{
	if (S->pTop == S->pBottom)
		return true;
	else
		return false;
}

4、出栈出栈的值用e返回

在这里插入图片描述

bool pop(pStack S, ElemType &e)
{
	pSNode p = S->pTop;//定义临时指针p指向栈顶
	if (StackEmpty(S))
	{
		return false;
	}
	e = S->pTop->data;//获取栈顶指向结点值
	S->pTop = S->pTop->next;//栈顶指针指向下一个结点
	free(p);//释放空间
	p = NULL;//临时指针p指向空
	return true;
}

5、遍历栈

在这里插入图片描述

void StackTraverse(pStack S)
{
	pSNode p = S->pTop;//定义临时指针p指向栈顶
	while (p!=S->pBottom)
	{
		printf("  %d",p->data);
		p = p->next;
	}
	printf("\n");
}

6、清空栈

在这里插入图片描述

void StackClear(pStack S)
{
	pSNode p = S->pTop;//定义临时指针p指向栈顶
	while (S->pTop != S->pBottom)
	{
		S->pTop = S->pTop->next;
		free(p);
		p = S->pTop;
	}
	free(p);
	p = NULL;	
}

7、计算栈的大小

int StackLength(pStack S)
{
	pSNode p = S->pTop;
	int i = 0;
	while (p!=S->pBottom)
	{
		i++;
		p = p->next;
	}
	return i;
}

最后给出完整代码

// 链式栈.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include <stdio.h>
#include<stdlib.h>
#include<malloc.h>

typedef int ElemType;//定义存储的数据类型
typedef struct SNode  //定义链结点结构
{
	ElemType data;
	SNode *next;
}SNode ,*pSNode;
 
typedef struct Stack  //定义栈结构
{
	pSNode pTop;
	pSNode pBottom;
}Stack, *pStack;

//1、初始化栈
void InitStack(pStack S);
//2、压栈
bool Push(pStack S, ElemType e);
//3、判断栈是否为空
bool StackEmpty(pStack S);
//4、出栈出栈的值用e返回
bool pop(pStack S, ElemType &e);
//5、遍历栈
void StackTraverse(pStack S);
//6、清空栈
void StackClear(pStack S);
//7、计算栈的大小
int StackLength(pStack S);


int main()
{
	Stack S;
	InitStack(&S);
	for (int i = 0; i < 10; i++)
	{
		Push(&S, 2 * i);
	}
	StackTraverse(&S);
	if (StackEmpty(&S))
	{
		printf("栈为空\n");
	}
	else
	{
		printf("栈不为空\n");
	}
	printf("栈的大小为%d\n",StackLength(&S));
	ElemType e;
	for (int i = 0; i < 3; i++)
	{
		pop(&S, e);
		printf("第 %d 个出栈元素值为 %d\n",i,e);
		printf("栈的大小为%d\n", StackLength(&S));
	}
	
	StackClear(&S);
	printf("栈的大小为%d\n", StackLength(&S));
	return 0;
}

//1、初始化栈
void InitStack(pStack S)
{
	pSNode pNewNode = (pSNode)malloc(sizeof(SNode));
	if (pNewNode == NULL)
	{
		printf("动态内存分配失败!程序结束\n");
		exit(-1);
	}
	S->pTop = S->pBottom = pNewNode;// 栈顶和栈底都指向头结点
}
//2、压栈
bool Push(pStack S,ElemType e)
{
	pSNode pNewNode = (pSNode)malloc(sizeof(SNode));//创建新结节点
	if (pNewNode == NULL)
	{
		printf("动态内存分配失败!程序结束\n");
		exit(-1);
	}
	pNewNode->data = e;//新结点赋值
	pNewNode->next = S->pTop;//新结点指向栈顶
	S->pTop = pNewNode;//栈顶指针指向新结点
	return true;
}
//3、判断栈是否为空
bool StackEmpty(pStack S)
{
	if (S->pTop == S->pBottom)
		return true;
	else
		return false;
}
//4、出栈出栈的值用e返回
bool pop(pStack S, ElemType &e)
{
	pSNode p = S->pTop;//定义临时指针p指向栈顶
	if (StackEmpty(S))
	{
		return false;
	}
	e = S->pTop->data;//获取栈顶指向结点值
	S->pTop = S->pTop->next;//栈顶指针指向下一个结点
	free(p);//释放空间
	p = NULL;//临时指针p指向空
	return true;
}
//5、遍历栈
void StackTraverse(pStack S)
{
	pSNode p = S->pTop;//定义临时指针p指向栈顶
	while (p!=S->pBottom)
	{
		printf("  %d",p->data);
		p = p->next;
	}
	printf("\n");
}
//6、清空栈
void StackClear(pStack S)
{
	pSNode p = S->pTop;//定义临时指针p指向栈顶
	while (S->pTop != S->pBottom)
	{
		S->pTop = S->pTop->next;
		free(p);
		p = S->pTop;
	}
	free(p);
	p = NULL;	
}
//7、计算栈的大小
int StackLength(pStack S)
{
	pSNode p = S->pTop;
	int i = 0;
	while (p!=S->pBottom)
	{
		i++;
		p = p->next;
	}
	return i;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值