栈的顺序存储实现(C语言)(数据结构与算法)

  • 栈的顺序存储实现通常使用数组来完成。实现方法包括定义一个固定大小的数组,以及一个指向栈顶的指针。当元素入栈时,指针加一并将元素存储在相应位置;当元素出栈时,指针减一并返回相应位置的元素。

1. 顺序栈定义

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

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

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


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

1.1 进栈操作

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

//新元素入栈
bool Push(SqStack &S, ElemType x)
{
	if(S.top == MaxSize-1)  //栈满 报错  S.top = 9 栈满
		return false;
		
	//下面两句等价于:S.data[++S.top] = x;
	S.top = S.top+1;     //栈顶指针先+1 , 让指针从-1变为0
	S.data[S.top] = x;   //新元素入栈 
	
	return true;
}

1.2 出栈操作

c 复制代码
#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];   //栈顶元素先出栈, 存储在x中,然后栈顶指针下移一位
	S.top = S.top -1;	//指针减一,其实只是逻辑上被删除了,栈顶指针向下移动了一位而已
	return true;
}


![在这里插入图片描述](https://img-blog.csdnimg.cn/e67e95eade364b7a8bd1867876ba0045.png)

1.3 读取栈顶元素

c 复制代码
//出栈操作
bool Pop(SqStack &S, ElemType &x)
{
	if(S.top = -1)		//栈空, 报错
		return false;
	//以下两行,等价于x = S.data[S.top--];  //先出栈,指针再减一
	x = S.data[S.top];   //栈顶元素先出栈, 存储在x中,然后栈顶指针下移一位
	S.top = S.top -1;	//指针减一,其实只是逻辑上被删除了,栈顶指针向下移动了一位而已    与出栈操作的唯一区别
	return true;
}

//读栈操作
bool GetTop(SqStack S, ELemType &x)
{
	if(S.top == -1)
		return false;
	x = S.data[S.top];  //x纪录栈顶元素  只是将此时top指针指向的数据元素,用x返回,并没有top--操作
	return true;
}

2. 另一种方式

让top刚开始指向 0,判断栈是否为空,就变成了看S.top是否为0

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

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

void testStck()
{
	SqStack S; //声明一个顺序栈 
	InitStack(S);
	//后续操作.......
}

//判空操作
bool StackEmpty(SqStack S)
{
	if(S.top == 0)   //栈空 
		return true;
	else		//不空
		return false;
}
相关推荐
鸽芷咕20 分钟前
【Python报错已解决】ModuleNotFoundError: No module named ‘paddle‘
开发语言·python·机器学习·bug·paddle
Jhxbdks30 分钟前
C语言中的一些小知识(二)
c语言·开发语言·笔记
java66666888830 分钟前
如何在Java中实现高效的对象映射:Dozer与MapStruct的比较与优化
java·开发语言
Violet永存31 分钟前
源码分析:LinkedList
java·开发语言
代码雕刻家32 分钟前
数据结构-3.1.栈的基本概念
c语言·开发语言·数据结构
Fan_web34 分钟前
JavaScript高级——闭包应用-自定义js模块
开发语言·前端·javascript·css·html
梦想科研社39 分钟前
【无人机设计与控制】四旋翼无人机俯仰姿态保持模糊PID控制(带说明报告)
开发语言·算法·数学建模·matlab·无人机
风等雨归期39 分钟前
【python】【绘制小程序】动态爱心绘制
开发语言·python·小程序
千穹凌帝42 分钟前
SpinalHDL之结构(二)
开发语言·前端·fpga开发
AlexMercer10121 小时前
【C++】二、数据类型 (同C)
c语言·开发语言·数据结构·c++·笔记·算法