25考研数据结构复习·3.1栈·顺序栈·链栈

本文介绍了栈的基本概念,包括逻辑结构、数据运算和存储结构,详细阐述了栈的特点(如栈顶允许插入和删除),并列举了栈的常见操作,如初始化、增删查等。此外,文章还探讨了顺序栈和链栈的实现方法,以及共享栈的概念。
摘要由CSDN通过智能技术生成

栈(Stack)基本概念

数据结构三要素——逻辑结构、数据的运算、存储结构(物理结构)

  • 定义

    栈(Stack)只允许在一端进行插入或删除操作线性表

    逻辑结构:与普通线性表相同

    数据的运算:插入、删除操作有区别

  • 重要术语

    • 栈顶

      允许插入和删除的一端

    • 栈底

      不允许插入和删除的一端

    • 空栈

 

  • 基本操作

    • 创、销

      InitStack(&S):初始化栈。构造一个空栈S,分配内存空间。

      DestroyStack(&L):销毁栈。销毁并释放栈S所占用的内存空间。

    • 增、删:只能在栈顶操作

      Push(&S,x):进栈,若栈S未满,则将x加入使之成为新栈顶

      Pop(&S,&x):出栈,若栈S非空,则弹出栈顶元素,并用x返回。

      删除栈顶元素

    • 查:栈的使用场景中大多只访问栈顶元素

      GetTop(S,&x):读栈顶元素。若S非空,则用x返回栈顶元素。

      不删除栈顶元素

    • 其他常用操作

      StackEmpty(S):判断一个栈S是否为空。若S为空,则返回true,否则返回false

  • 常考题型

    进栈顺序: a → b → c → d → e

    有哪些合法的出栈顺序?

    • 结论

      n个不同元素进栈,出栈元素不同排列的个数为

顺序栈的实现

  • 用顺序存储方式实现的栈

    • 定义

#define MaxSize 10       //定义栈中元素的最大个数
typedef struct{
	ElemType data[MaxSize] //静态数组存放栈中元素
	int top;               //栈顶指针
}SqStack;                //Sq:sequence——顺序

void testStack(){
		SqStack S;  //声明一个顺序栈(分配空间)
		//……后续操作……
}

 顺序存储:给各个数据元素分配连续的存储空间,大小为:MaxSize*sizeof(ElemType)

 

  • 基本操作

    • 创(初始化)

#define MaxSize 10       //定义栈中元素的最大个数
typedef struct{
	ElemType data[MaxSize] //静态数组存放栈中元素
	int top;               //栈顶指针
}SqStack;                //Sq:sequence——顺序

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

void testStack(){
		SqStack S;  //声明一个顺序栈(分配空间)
		//……后续操作……
}

//判断栈空
bool StackEmpty(SqStack S){
		if(S.top == -1)      //栈空
				return true;
		else
				return false;
}

 增(进栈)

#define MaxSize 10       //定义栈中元素的最大个数
typedef struct{
	ElemType data[MaxSize] //静态数组存放栈中元素
	int top;               //栈顶指针
}SqStack; 

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

 删(出栈)

#define MaxSize 10       //定义栈中元素的最大个数
typedef struct{
	ElemType data[MaxSize] //静态数组存放栈中元素
	int top;               //栈顶指针
}SqStack; 

//出栈操作
bool Pop(SqStack &S,ElemType &x){
		if(S.top == MaxSize-1)  //栈空,报错
				return false;
		x = S.data[S.top];   //栈顶元素先出栈
		S.top = S.top -1;   //指针再减1,数据还残留在内存中,只是逻辑上被删除了
		return true;
}

 查(获取栈顶元素)

#define MaxSize 10       //定义栈中元素的最大个数
typedef struct{
	ElemType data[MaxSize] //静态数组存放栈中元素
	int top;               //栈顶指针
}SqStack; 

//出栈操作
bool Pop(SqStack &S,ElemType &x){
		if(S.top == MaxSize-1)  //栈空,报错
				return false;
		x = S.data[S.top--]
		return true;
}

//读栈顶元素
bool GetTop(SqStack S,ElemType &x){
		if(S.top== -1)  //栈空,报错
				return false;
		x = S.data[S.top];   //x记录栈顶元素
		return true;
}

另一种方式: 

#define MaxSize 10       //定义栈中元素的最大个数
typedef struct{
	ElemType data[MaxSize] //静态数组存放栈中元素
	int top;               //栈顶指针
}SqStack;                

//初始化栈
void InitStack(SqStack &S){
		S.top = 0;   //初始化栈顶指针(初始指向0)
}
void testStack(){
		SqStack S;  //声明一个顺序栈(分配空间)
		InitStack(S);
		//……后续操作……
}

//判断栈空
bool StackEmpty(SqStack S){
		if(S.top ==0)  //栈空
				return true;
		else
				return false;
}

//进栈
S.data[S.top++]=x;
//出栈
x=S.data[--S.top];

栈满条件:top == MaxSize

缺点:栈的大小不可变


 共享栈(两个栈共享同一片空间)

#define MaxSize 10       //定义栈中元素的最大个数
typedef struct{
	ElemType data[MaxSize] //静态数组存放栈中元素
	int top0;               //0号栈栈顶指针
	int top1;               //1号栈栈顶指针
}SqStack;                

//初始化栈
void InitStack(SqStack &S){
		S.top0 = -1;   //初始化栈顶指针
		S.top1 = MaxSize;
}
满栈的条件:top0 + 1 = top1  

 总结

 

链栈的实现

  • 用链式存储方式实现的栈

    (头插法建立单链表)对头结点的后插操作 → 进栈

    (单链表的删除操作)对头结点的后删操作 → 出栈

    • 定义

typedef struct Linknode{
		ElemType data;             //数据域
		struct Linknode *next;      //指针域
}*LiStack;                     //栈类型定义

 基本操作参考单链表(创:初始化;增:进栈;删:出栈;查:获取栈顶元素)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Annabelle.02

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值