栈的顺序存储实现(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;
}
相关推荐
LDR0063 小时前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术3 小时前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园4 小时前
C++20 Modules 模块详解
java·开发语言·spring
swordbob4 小时前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
源分享5 小时前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm
Luminous.5 小时前
C语言--day30
c语言·开发语言
玖玥拾5 小时前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
何以解忧,唯有..5 小时前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
謓泽5 小时前
C语言不是语法,是通往机器的地图。
c语言·开发语言
云水一下5 小时前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php