C/C++语言数据结构快速入门(代码解析+内容解析)栈

Posted 蓝盒子bluebox

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++语言数据结构快速入门(代码解析+内容解析)栈相关的知识,希望对你有一定的参考价值。

一、栈(Stack)

1、栈的基本概念

在这里插入图片描述

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

存储结构不同
运算的实现方式不同

(1)栈的定义

线性表是具有相同数据类型的n (n>0)个数据元素的有限序列,其中n为表长,当n =0时线性表是一个空表。

若用L命名线性表,则其一般表示为

L= (a1, a2, … , ai, ai+1,… , an)
栈( Stack)是只允许在一端进行插入或删除操作的线性表
在这里插入图片描述
在这里插入图片描述
栈( Stack)是只允许在一端进行插入或删除操作的线性表
在这里插入图片描述

(2)重要术语:栈顶、栈底、空栈

在这里插入图片描述
在这里插入图片描述

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

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

2、栈的基本操作

(1)穿越:线性表的基本操作

lnitList(&L):初始化表。构造一个空的线性表L,分配内存空间。
DestroyList(&L):销毁操作。销毁线性表,并释放线性表L所占用的内存空间。

ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。
ListDelete(&L,i,&e):删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。

LocateElem(L,e):按值查找操作。在表L中查找具有给定关键字值的元素。
GetElem(L,i):按位查找操作。获取表L中第i个位置的元素的值。

其他常用操作:

Length(L):求表长。返回线性表L的长度,即L中数据元素的个数。

PrintList(L):输出操作。按前后顺序输出线性表L的所有元素值。

Empty(L):判空操作。若L为空表,则返回true,否则返回false。

(2)栈的基本操作

a、创建和销毁

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

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

b、增、删

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

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

c、读取栈顶元素:查:栈的使用场景大多只访问栈顶的元素
GetTop(S,&x):读取栈顶元素。若栈S为非空,则用x返回栈顶元素。(获取但是不删除栈顶元素)

d、其他常用操作
StackEmpty(S):判断一个栈S是否为空。若S为空,则返回true,否则返回false

(3)栈的常考题型

进栈顺序:

a->b->c->d->e

一那些合法的出栈顺序?
第一种情况
在这里插入图片描述
第二种情况
在这里插入图片描述
在这里插入图片描述
知识点回顾
在这里插入图片描述

3、顺序栈的实现

顺序栈
在这里插入图片描述

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

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

在这里插入图片描述

在这里插入图片描述

(2)初始化操作
#define MaxSize 10			//定义栈中元素的最大个数 
typedef struct{				
	ElemType data[MaxSize];	//静态数组存放栈中元素 
	int top;				//栈顶指针 
}SqStack; //Sq :squence ---顺序
//初始化栈
void InitStack(SqStack &S){
	S.top = -1;   //初始化栈顶指针 
} 
void testStack(){
	SqStack S;//声明一个顺序栈(分配空间)
	InitStack(S)
	//...后续操作.... 
} 
//判断栈空
bool StackEmpty(SqStack S){
	if(S.top == -1)//栈空
		return true;
	else		   //不空 
		return false; 
} 

在这里插入图片描述

(3)进栈操作
#include<stdio.h>	
#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.top = S.top + 1;		//指针先加1 
	S.data[S.top] = x;		//新元素入栈 
	return true;
} 

在这里插入图片描述
如果顺序栈存满
在这里插入图片描述

(4)出栈操作
#include<stdio.h>	
#define MaxSize 10	//定义栈中元素的最大个数 
typedef struct{
	Elemtype data[MaxSize]; //静态数组存放栈中的元素 
	int top;				//栈顶指针
}SqStack;

bool Pop(SqStack &S,ElemType &x){
	if(S.top == -1)    //栈空,报错 
		return false;
	x=S.data[S.top];//栈顶元素先出栈
	S.top = S.top - 1; //指针再减1 
	return true;
}

在这里插入图片描述
在这里插入图片描述

(5)读取栈顶元素操作
#include<stdio.h>	
#define MaxSize 10	//定义栈中元素的最大个数 
typedef struct{
	Elemtype data[MaxSize]; //静态数组存放栈中的元素 
	int top;				//栈顶指针 
}SqStack;
//出栈操作
bool Pop(SqStack &S,ElemType &x){
	if(S.top == -1)    //栈空,报错 
		return false;
	x=S.data[S.top-1]; //指针再减1 
	return true;
}
//读取栈顶元素
bool GetTop(SqStack S,ElemType &x){
	if(S.top == -1)
		return false;
	x = S.data[S.top];
	return true;
} 

在这里插入图片描述
另外一种操作

#include<stdio.h>	
#define MaxSize 10	//定义栈中元素的最大个数 
typedef struct{
	Elemtype data[MaxSize]; //静态数组存放栈中的元素 
	int top;				//栈顶指针 
}SqStack;
//初始化栈 
void InitStack(SqStack &S){
	S.top = 0;
}
//读取栈顶元素
void testStack(){
	SqStack S;//声明一个顺序栈(分配空间)
	InitStack(S);
	//...后续操作... 
} 
//判断栈空
bool StackEmpty(SqStack S){
	if(S.top == 0)		//栈空
		return true;
	else				//不空
		return false;
} 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(6)共享栈:两个栈共享同一片空间
#include<stdio.h>	
#define MaxSize 10	//定义栈中元素的最大个数 
typedef struct{
	Elemtype data[MaxSize]; //静态数组存放栈中的元素 
	int top0;				//0号栈顶指针 
	int top1;				//1号栈顶指针 
}ShStack;

//初始化栈
void InitStack(ShStack &S){
	S.top0 = -1;		//初始化栈顶指针 
	S.top1 = MaxSize;
} 

共享栈存满的情况
在这里插入图片描述
共享栈存满的情况
在这里插入图片描述
在这里插入图片描述

(7)知识点回顾与重要考点

在这里插入图片描述

4、链栈

在这里插入图片描述

(1)穿越:头插法建立单链表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

//后插操作:在p结点之后插入元素e
bool InsertNextNode(LNode *p,ElemType e){
	if(p == NULL)
		return false;
	LNode *s = (LNode *)malloc(sizeof(LNode));
	
	if (s == NULL)	//内存分配失败 
		return false;
	s->data = e;		//用结点s保存数据元素e 
	s->next = p->next;
	p->next = s;		//将结点s连到p之后 
	return true;
} 

在这里插入图片描述

(2)穿越:单链表的删除操作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
链头看为栈顶

(3)链栈的定义
#include<stdio.h>
typedef struct Linknode{
	ElemType data;			//数据域 
	struct Linknode *next;	//指针域 
}*LiStack; 					//栈类型定义 

在这里插入图片描述

(4)知识回顾域重要考点

在这里插入图片描述

以上是关于C/C++语言数据结构快速入门(代码解析+内容解析)栈的主要内容,如果未能解决你的问题,请参考以下文章

C/C++语言数据结构快速入门(代码解析+内容解析)栈的应用

C/C++语言数据结构快速入门(代码解析+内容解析)栈

C/C++语言数据结构快速入门(代码解析+内容解析)栈

C/C++语言数据结构快速入门(代码解析+内容解析)队列的应用

C/C++语言数据结构快速入门(代码解析+内容解析)特殊矩阵

C/C++语言数据结构快速入门(代码解析+内容解析)队列