3.1 栈

一、栈的基本概念
1.栈的定义
	栈是只允许在一端进行插入或删除操作的线性表。首先栈是一种线性表,但限定这种线性表
只能在一端进行插入和删除操作。
	栈顶。线性表允许进行插入删除的那一端。
	栈底。固定的,不允许进行插入和删除的另一端。
	空栈。不含任何元素的空栈。
	栈的数学性质:n个不同元素进栈出栈元素不同排列的个数为卡特兰数,为(1/n+1)(C n 2n)

2.栈的基本操作
InitStack(&S):初始化一个空栈S
StackEmpty(S):判断栈是否为空栈
Push(&S,x):进栈,若S未满,则将x加入使之成为新栈顶
Pop(&S,&x):出栈,若S非空,则弹出栈顶元素,并用x返回
GetTop(S,&x):读栈顶元素,若栈S非空,则用x返回栈顶元素
DestroyStack(&S):销毁栈,并释放栈S占用的存储空间。

二、栈的顺序存储结构
栈是一种操作受限的线性表,有两种存储方式。
1.顺序栈的实现。
	采用顺序存储的栈称为顺序栈,它利用一组地址连续的存储单元存放自栈底到栈顶的数据元
素,同时附设一个指针指示当前栈顶元素的位置。
	栈的顺序存储类型可描述为
	#define MaxSize 50
	typedef struct{
    
    
		Elemtype data[MaxSize];
		int top;
	}SqStack;

2.顺序栈的基本运算
(1)初始化
void InitStack(SqStack &S){
    
    
	S.top=-1;
}

(2)判栈空
bool IsEmpty(SqStack S){
    
    
	if(S.top==-1)
		return true;
	else
		return false;
}

(3)进栈
bool Push(SqStack &S,Elemtyoe x){
    
    
	if(S.top==MaxSize-1)//栈满,报错
		return false;
	S.data[++S.top]=x;//指针先加1再进栈
	return true;
}

(4)出栈
bool Pop(SqStack &S,Elemtyoe &x){
    
    
	if(S.top==-1)//栈空,报错
		return false;
	x=S.data[S.top--];//先出栈,指针减一
	return true;
}

(5)读栈顶元素
bool GetTop(SqStack S,Elemtyoe &x){
    
    
	if(S.top==-1)//栈空,报错
		return false;
	x=S.data[S.top];//x记录栈顶元素
	return true;
}

3.共享栈
	利用栈顶位置相对不变的特性,可以让两个顺序栈共享一个一维数组空间,将两个栈的栈底
分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸。
	两个栈的栈顶指针都指向栈顶元素,top0=-10号栈为空,top0=MaxSize时1号栈为空;仅
当两个栈顶指针相邻(top1-top0=1)时,判断栈满。
	共享栈是为了更有效地利用存储空间,两个栈的空间相互调节,只有在整个存储空间被占满
时发生上溢,其存取数据的时间复杂度均为O(1),所以对存取效率没有什么影响。

三、栈的链式存储结构
	链栈的优点是便于多个栈共享存储空间和提高效率,且不存在栈满上溢的情况。通常采用单
链表实现,并规定所有操作都是在单链表的表头进行的。这里规定链栈没有头结点。
	栈的链式存储类型可描述为
	typedef struct LinkNode{
    
    
		Elemtype data;
		struct Linknode *next;
	}*LiStack;

猜你喜欢

转载自blog.csdn.net/SeNiLS/article/details/114321010
3.1