3.1 栈

本文详细介绍了栈这种数据结构的定义,包括顺序存储和链式存储两种实现方式。顺序存储中,栈使用静态数组实现,通过初始化、判空、入栈、出栈、读栈等操作;链式存储则通过链表节点进行操作,同样包含初始化、判空、入栈、出栈、读栈等基本操作。链栈相比于顺序栈,其操作更加灵活。
摘要由CSDN通过智能技术生成

3.1.1  栈的定义

3.1.2  栈的顺序存储

1)顺栈 定义

#define MaxSize 10		//定义 栈 元素最大数
typedef struct Stack
{
	int data[MaxSize];	//静态数组 存放元素
	int top;			//栈顶下表(指针)
}SqStack;

 2)栈的初始化

void InitStack(SqStack &S)	//初始化栈 
{
	S.top = -1;			
}

3)栈的判空

bool Empty(SqStack &S)		//判空
{
	return S.top == -1;
}

4)入栈

bool Push(SqStack &S, int e)    //入栈
{
	if (S.top == MaxSize - 1)return false;	//栈满
	S.data[++S.top] = e;		//元素 e 入栈
	return true;
}

5)出栈

bool Pop(SqStack &S, int &e)//出栈
{
	if (S.top == -1)return false;			//栈为空
	e = S.data[S.top--];		//元素 e 出栈
	return true;
}

6)读栈

bool GetTop(SqStack &S, int &e)//读栈
{
	if (S.top == -1)return false;
	e = S.data[S.top];			//e 读栈
	return true;
}

7)共享栈

 3.1.3  栈的链式存储

1)链栈 定义 

typedef struct LNode                  
{
	int data;                    //数据域
	struct LNode *next;          //指针域
}*LiStack;						 // 栈类型 定义
//为什么链栈不需要头结点
//因为栈都是在头部进行操作
//加入头结点 使运算更复杂

 2)栈的初始化

void InitStack(LiStack &S)//链栈 初始化
{
	S = NULL;
}

3)栈的判空

bool Empty(LiStack &S)//栈的判空
{
	return S == NULL;
}

4)入栈

bool Push(LiStack &S, int e)//入栈
{
	LNode *p = (LNode*)malloc(sizeof(LNode));
	if (p == NULL)return false;
	p->data = e;
    p->next = NULL;
	if (S == NULL)		//空栈
		S = p;
	else				//非空栈
	{
		p->next = S;
		S = p;
	}
	return true;
}

5)出栈

bool Pop(LiStack &S, int &e)//出栈
{
	if (S == NULL)return false;
	e = S->data;

	LNode *p = S;	//出栈
	S = S->next;
	free(p);		//释放

	return true;
}

6)读栈

bool GetTop(LiStack &S, int &e)//读栈
{
	if (S == NULL)return false;
	e = S->data;
	return true;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值