栈和队列基本概念,顺序栈的表示和实现

(stack)是限定仅在表尾进行插入或删除操作的线性表。其表尾称为栈顶(top),表头称为栈底(bottom)。不含元素的栈称为空栈
在这里插入图片描述
假设栈S=(a1,a2,a3,…,an),a1则为栈底元素,an为栈顶元素,元素按a1,a2,a3,…,an的顺序进栈,按an,…,a3,a2,a1的顺序出栈,如上图所示,所以栈又称为后进先出的线性表。

队列

和栈相反,队列(queue)是一种先进先出的线性表。它只允许在表的一段进行插入,而在另一端删除元素。这和日常生活中的排队是一致的,最早进入队列的元素最先离开。在队列中,允许插入的一端称为队尾(rear),允许删除的一段称为队头(front)。在这里插入图片描述
假设队列q=(a1,a2,a3,…,an),那么,a1就是队头元素,an就是队尾元素,队列的元素按照a1,a2,a3,…,an的顺序进入,再依次按照a1,a2,a3,…,an的顺序离开队列,只有前一个元素离开队列后当前元素才能离开队列,如上图所示。

顺序栈

顺序栈是指利用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶元素的数据元素,指针top指示栈顶元素所在顺序栈的位置,top=0时为空栈,当top和base的值相等时,栈为空栈。
在这里插入图片描述

顺序栈的存储结构

typedef struct {
	elemtype *base;//栈底指针
	elemtype *top;//栈顶指针
	int stacksize;//栈的最大容量
}sqstack;

顺序栈的基本操作

初始化

Status InitStack(sqstack &s){
	s.base=new elemtype[MAXSIZE];//为顺序栈分配一个MAXSIZE大的存储空间 
	if(!s.base) exit(ERROR);//存储分配失败 
	s.top=s.base;//top初始为base,空栈 
	s.stacksize=MAXSIZE;//stacksize置为栈的最大容量MAXSIZE 
	return OK; 
}

入栈

Status Push(sqstack &s,elemtype e){
	if(s.top-s.base==MAXSIZE) return ERROR;//栈满退出
	*s.top++=e; //元素e压入栈顶,栈顶指针加1
	return OK; 
} 

这里*s.top++=e;相当于*s.top=e;s.top++;

出栈

Status Pop(sqstack &s,elemtype &e){
	if(s.top==s.base) return ERROR;//栈空退出
	e=*--s.top; //栈顶指针减1,将栈顶元素赋给e 
	return OK;
} 

top指针指向的位置为栈顶元素上方,所以先将top减1。

取栈顶元素

elemtype Gettop(sqstack s){
	if(s.top!=s.base)//判断栈非空 
	 return *(s.top-1);//返回栈顶元素,栈顶指针不变 
}

参考自《数据结构》严蔚敏版,学习专用。

发布了11 篇原创文章 · 获赞 26 · 访问量 4380

猜你喜欢

转载自blog.csdn.net/qq_45918426/article/details/104330428