数据结构(栈)

目录

栈和队列的定义和特点

队列

栈的实现

顺序栈的实现

顺序栈的存储结构

初始化

入栈

出栈

取栈顶元素

链栈

特点

链栈的存储结构

初始化

入栈

出栈

取栈顶元素


栈和队列的定义和特点

栈是限定只能在表尾进行插入和删除操作的线性表。对栈来说,表尾端称为栈顶,相应地,表头端称为栈底。不含元素的空表称为空栈。
栈是先进后出,后进先出的线性表。

1

队列

队列是一种先进先出的线性表,只允许在队尾插入,队头删除元素。

2

栈的实现

顺序栈的实现

顺序栈是利用顺序存储结构实现的栈。设置指针top指示栈顶元素在

顺序栈中的位置,以top=0表示空栈。设置指针base指示栈底元素在顺序栈中的位置。staksize指栈可使用的最大容量。
当top==base时,表示空栈。
当top-base==staksize时,表示栈满。

数据结构(栈)_第1张图片

 

顺序栈的存储结构

typedef struct {
	SElemType *base;//栈底指针
	SElemType *top;//栈顶指针
	int stacksize;//栈可用的最大容量
} SqStack;

初始化

1.让base指向栈底
2.初始化为空栈

Status InitStack(SqStack &S) {
	//构造一个空栈S
	S.base = new SElemType[MAXSIZE];//为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
	if (!S.base)
		exit(OVERFLOW); //存储分配失败
	S.top = S.base; //top初始为base,空栈
	S.stacksize = MAXSIZE; //stacksize置为栈的最大容量MAXSIZE
	return OK;
}

入栈

1.判断是否满栈
2.将新元素压入栈顶

Status Push(SqStack &S, SElemType e) {
	// 插入元素e为新的栈顶元素
	if (S.top - S.base == S.stacksize)
		return ERROR; //栈满
	*(S.top++) = e; //元素e压入栈顶,栈顶指针加1
	return OK;
}

出栈

数据结构(栈)_第2张图片

 

1.判断是否空栈
2.栈顶指针减一,栈顶元素出栈

Status Pop(SqStack &S, SElemType &e) {
	//删除S的栈顶元素,用e返回其值	
	if (S.base == S.top)
		return ERROR;//栈空
	e = *(--S.top); //栈顶指针减1,将栈顶元素赋给e
	return OK;
}

取栈顶元素

char GetTop(SqStack S) {//返回S的栈顶元素,不修改栈顶指针
	if (S.top != S.base) //栈非空
		return *(S.top - 1); //返回栈顶元素的值,栈顶指针不变
}

链栈

特点

顺序栈和顺序表一样,容易受最大空间容量的影响,满栈时扩大容量较复杂,所以可以使用链栈来处理问题。

 

链栈采用链式存储结构来实现,用单链表来表示。链栈不需要设置头结点。


数据结构(栈)_第3张图片

 

链栈的存储结构

typedef struct StackNode {
	SElemType data;
	struct StackNode *next;
} StackNode, *LinkStack;

初始化

让栈顶指针为空

Status InitStack(LinkStack &S) { // 构造一个空栈 S,栈顶指针置空
	S = NULL;
	return OK;
}

入栈

链栈入栈不需要判断满栈
1.为入栈元素e分配空间
2.将新结点数据域置为e
3.插入新结点
4.修改栈顶指针

数据结构(栈)_第4张图片

 

Status Push(LinkStack &S, SElemType e) {//在栈顶插入元素e
	LinkStack p;
	p = new StackNode; //生成新结点
	p->data = e; //将新结点数据域置为e
	p->next = S; //将新结点插入栈顶
	S = p; //修改栈顶指针为p
	return OK;
}

出栈

链栈出栈需要判断空栈
1.将栈顶元素赋给e
2.临时保存栈顶元素空间
3.修改栈顶指针
4.释放

Status Pop(LinkStack &S, SElemType &e) {//删除S的栈顶元素,用e返回其值
	LinkStack p;
	if (S == NULL)
		return ERROR; //栈空
	e = S->data; //将栈顶元素赋给e
	p = S; //用p临时保存栈顶元素空间,以备释放
	S = S->next; //修改栈顶指针
	delete p; //释放原栈顶元素的空间
	return OK;
}

取栈顶元素

SElemType GetTop(LinkStack S) {//返回S的栈顶元素,不修改栈顶指针
	if (S != NULL) //栈非空
		return S->data; //返回栈顶元素的值,栈顶指针不变
}

你可能感兴趣的:(数据结构,算法)