栈的实现操作

本文介绍了栈的基本概念,包括栈顶、栈底和LIFO特性,详细阐述了顺序存储(如使用数组实现)的栈操作(如InitStack、StackEmpty、Push、Pop、GetTop),以及如何通过共享一维数组实现共享栈以节省空间。还提及了链式存储的栈结构。
摘要由CSDN通过智能技术生成

栈(Stack)是只允许在一端进行插入或删除操作的线性表。注意:栈是一种线性表

几个定义理解:

栈顶(Top):线性表允许进行插入删除的那一端。

栈底(Bottom):固定的,不允许进行插入和删除的另一端。

空栈:不含任何元素的空表。

栈的操作特性:后进先出 Last In First Out,LIFO

栈的数学性质:n个不同元素进栈,出栈元素不同排列的个数为

栈的基本操作 

InitStack(&S):初始化一个空栈S

StackEmpty(S):判断一个栈是否为空,若栈S为空则返回true,否则返回false。

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

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

GetTop(S,&x):读栈顶元素,若栈S非空,则用x返回栈顶元素。

DestroyStack(&S):销毁栈,并释放栈S占用的存储空间。

栈的顺序存储

栈顶指针:S.top   

初始时设置:S.top=-1;

栈顶元素:S.data[S.top]

进栈操作:栈不满时,栈顶指针先加1,再送值到栈顶元素

出栈操作:栈不空时,先去栈顶元素之,在将栈顶指针减1

栈空条件:S.top==-1;

栈满条件:S.top==MaxSize-1;

栈长:S.top+1

栈的顺序存储类型定义

#define MaxSize 50

typedef struct{
	int 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;
}

 进栈

bool Push(SqStack &S,int x){
	if(S.top==MaxSize-1)
	   return false;
	S.data[++S.top]=x;//指针先加1,在入栈 
	return true;
} 

出栈 

bool Pop(SqStack &S,int &x) {
	if(S.top==-1)
	  return false;
	x=S.data[S.top--];//先出栈,指针在减1
	return true; 
}

读栈顶元素

bool GetTop(SqStack &S,int &x){
	if(S.top==-1)
	   return false;
	x=S.data[S.top];
	return true;
} 
如果栈顶指针初始化为S.top=0,即top指针指向栈顶元素的下一个位置,则入栈变为S.data[S.top++]=x;出栈变为x=S.data[--S.top];

 共享栈

利用栈底位置相对不变的特性,将两个顺序栈共享一个一维数组空间,将两个栈的栈底设置在共享空间的两端,两个栈顶向共享空间的中间延伸

 top0=-1时0号栈是空的,top1=MaxSize时1号栈是空的。

仅当两个栈顶指针相邻(top1-top0=1)时,判断栈为满。

当0号栈进栈时,top0先加1再赋值;当1号栈进站时top1先减再赋值

共享栈是为了更有效地利用存储空间,两个栈的空间相互调节,只有在整个存储空间被占满时才发生上溢。

栈的链式存储

栈的链式存储类型可描述为

typedef struct Linknode{
	int data;
	struct Linknode *next;
}*LiStack;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值