数据结构与算法学习笔记-栈和队列

声明:本博客仅为本人学习途中做的笔记 采自青岛大学王卓老师的视频教学 主要内容为算法思路,具体代码实现还需修改后才能运行,望各位看官多多包涵,您的点赞与评论是对我最大的肯定!1.栈和队列的定义和特点栈和队列是两种常用的、重要的数据结构栈和队列是限定插入和删除只能在表的"端点"进行的线性表栈和队列是线性表的子集(是插入和删除位置受限的线性表)由于栈的操作具有后进先出的固有特性,使得栈成为程序设计中的有用工具。另外,如果问题求解的过程具有"后进先出"的天然特性的话,则求解的算法中也必然需要利用.
摘要由CSDN通过智能技术生成

声明:本博客仅为本人学习途中做的笔记 采自青岛大学王卓老师的视频教学 主要内容为算法思路,具体代码实现还需修改后才能运行,望各位看官多多包涵,您的点赞与评论是对我最大的肯定!


1.栈和队列的定义和特点

栈和队列是两种常用的、重要的数据结构
栈和队列是限定插入和删除只能在表的"端点"进行的线性表
栈和队列是线性表的子集(是插入和删除位置受限的线性表)

由于栈的操作具有后进先出的固有特性,使得栈成为程序设计中的有用工具。另外,如果问题求解的过程具有"后进先出"的天然特性的话,则求解的算法中也必然需要利用"栈".

  • 数制转换
  • 括号匹配的检验
  • 行编辑程序
  • 迷宫求解
  • 表达式求值
  • 八皇后问题
  • 函数调用
  • 递归调用的实现
线性表 队列(先进先出)
Insert(L,i,x) 1<=i<=n+1 Insert(S,n+1,x) Insert(Q,n+1,x)
Delete(L,i)1<=i<=n Delete(S,n) Delete(Q,1)

栈是一个特殊的线性表,是限定仅在一端(通常是表尾)进行插入和删除操作的线性表。又称为后进先出的线性表
表尾a n _n n端称为栈顶,表头a 1 _1 1端称为栈底Base
插入元素到栈顶(即表尾)的操作,称为入栈。
从栈顶(即表尾)删除最后一个元素的操作,称为出栈。

队列是一种先进先出的线性表,在表一端插入,在另一端删除

2.栈的表示和操作的实现

由于栈本身就是线性表,于是栈也有顺序存储和链式存储两种实现方式
栈的顺序存储–顺序栈
栈的链式存储–链栈

顺序栈的表示和实现

存储方式:同一般线性表的顺序存储结构完全相同,利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。栈底一般在低地址端
附设top指针,指示栈顶元素在顺序栈中的位置
另设base指针,指示栈底元素在顺序栈中的位置
但是,为了方便操作,通常top指针指示真正的栈顶元素之上的下标地址
另外,用Stacksize表示栈可使用的最大容量
空栈:base == top是栈空标志
栈满:top-base == stacksize
栈满时的处理方法:
1.报错,返回操作系统
2.分配更大的空间,作为栈的存储空间,将原栈的内容移入新栈
在这里插入图片描述
在这里插入图片描述

使用数组作为顺序栈存储方式的特点:
简单、方便、但易产生溢出(数组长度固定)
上溢(overflow):栈已经满,又要压入元素
下溢(underflow):栈已经空,还要弹出元素

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

顺序栈的表示和实现

Status InitStack(SqStack &S){
   //构造一个空栈
    S.base = new SElemType[MAXSIZE];
    //或S.base=(SElemType*)malloc(MAXSIZE*sizeof(SElemType)); 
    if(!S.base) exit(OVERFLOW);//存储分配失败
    S.top = S.base;//栈顶指针等于栈底指针
    S.stacksize = MAXSIZE;
    return OK;
}

顺序栈判断栈是否为空

Status StackEmpty(SqStack S){
   
    //若栈为空,返回TRUE;否则返回FALSE
    if(S.top == S.base)
        return TRUE;
    else 
        return FALSE;
}

求顺序栈长度

int StackLength(SqStack S){
   
    <
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值