栈的顺序存储实现(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;
}
相关推荐
starzy19908 分钟前
深入理解Scala匿名函数:函数式编程基石
开发语言·scala
apcipot_rain1 小时前
C++转Java日记(05)
java·开发语言·c++
apcipot_rain10 小时前
C++转Java日记(04)
java·开发语言·c++
wuyk55510 小时前
Keil工具链-第05讲-启动文件与__main到底做了什么
c语言·stm32·单片机·嵌入式硬件·物联网
云和数据.ChenGuang11 小时前
LangGraph 异步 Node 的设计与写法实践
开发语言·人工智能·python·机器学习·php
蜗牛一步步往上爬14 小时前
第十六章 C++语言在深度学习中的应用
开发语言·c++·深度学习
张张123y16 小时前
DSH 插件调试避坑:client.js 设置面板、热重载与高频报错排查表
开发语言·javascript·人工智能·开源·ecmascript·后端开发·ai agent
Navigator_Z18 小时前
LeetCode //C - 1317. Convert Integer to the Sum of Two No-Zero Integers
c语言·算法·leetcode
冻柠檬飞冰走茶19 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
FRing0320 小时前
vue2干货总结7(自定义指令、插槽、单页应用程序、路由的使用(VueRouter))
开发语言·前端·vue.js·vue2