栈的顺序存储实现(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;
}
相关推荐
明月看潮生28 分钟前
青少年编程与数学 02-019 Rust 编程基础 14课题、并发编程
开发语言·青少年编程·rust·编程与数学
Warren9839 分钟前
Java面试八股Spring篇(4500字)
java·开发语言·spring boot·后端·spring·面试
晚秋大魔王1 小时前
OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库——gnutls
java·开发语言
EelBarb1 小时前
python:一个代理流量监控的媒体文件下载脚本
开发语言·python
背帆1 小时前
go的interface接口底层实现
开发语言·后端·golang
小屁孩大帅-杨一凡1 小时前
一个简单点的js的h5页面实现地铁快跑的小游戏
开发语言·前端·javascript·css·html
顾子茵1 小时前
c++从入门到精通(四)--动态内存,模板与泛型编程
java·开发语言·c++
邹诗钰-电子信息工程1 小时前
嵌入式自学第二十二天(5.15)
c语言
电信2301杨臣2 小时前
QT---信号与槽
开发语言·qt
明月看潮生2 小时前
青少年编程与数学 02-019 Rust 编程基础 07课题、字符串
开发语言·青少年编程·rust·编程与数学