数据结构 -《大话数据结构》读书笔记(三)-栈和队列

本文详细介绍了栈和队列的概念、数据结构及其在实际中的应用。栈是后进先出(LIFO)的数据结构,重点讨论了顺序栈和链栈的实现,包括初始化、进栈、出栈操作。队列则是一种先进先出(FIFO)的数据结构,文章讲解了循环队列和链队列的存储方式和操作,强调了它们的时间复杂度和空间利用。
摘要由CSDN通过智能技术生成

栈的相关概念

栈(stack)是限定仅在表尾进行插入和删除操作的线性表
在这里插入图片描述

允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。
栈也被称为后进先出(Last In First Out)的线性表,LIFO结构
栈的插入操作(进栈),也称压栈、入栈PUSH
栈的删除操作(出栈),也称弹栈POP

进栈出栈变化

进出栈理解,假设右1,2,3依次入栈,能有哪些出栈形式

  • 321:123进,321出
  • 123:1进1出,2进2出,3进3出
  • 213:12进,21出,3进3出
  • 132:1进1出,23进,32出
  • 231:12进,2出,3进,31出

栈的抽象数据类型

ADT stack
Data
	同线性表
Operation
	InitStack(*S):初始化操作,建立一个空栈S
	DestoryStack(*S):栈存在,则销毁
	ClearStack(*S):清空栈
	StackEmpty(S):若栈空,返回true,否则返回false
	GetTop(*S,*e):若栈存在且非空,用e返回S的栈顶元素
	Push(*S,*e):若栈存在,插入新元素到栈S并成为栈顶元素
	Pop(*S,*e):删除S中栈顶元素,并用e返回其值
	StackLength(S):返回栈S的元素个数
endADT

栈的顺序存储结构及实现

类比游标卡尺:分配的空间是游标卡尺长度,游标即为栈顶,不动端为栈底,游标移动范围定小于游标咔嚓长度

  • 栈的顺序存储也是线性表顺序存储的简化,简称为顺序栈
  • 数组中,用下标为0的一端作为栈底,因为首元素都存在栈底,变化小
  • 栈顶top:若存储栈长度为StackSize,则top必须小于StackSize
  • 空栈:栈中有一个元素时top=0,以示区别,空栈的判定条件设为top=-1
/* 存储空间初始分配量 */
#define MAXSIZE 20

/* SElemType类型根据实际情况而定,这里假设为int */
typedef int SElemType;

/* 顺序栈结构 */
typedef struct
{
   
    SElemType data[MAXSIZE];
    int top; /* 用于栈顶指针 */
}SqStack;

假设一个栈,StackSize为5,则栈普通情况、空栈和栈满的情况
在这里插入图片描述

顺序存储结构初始化、进栈、出栈操作

在这里插入图片描述
顺序存储结构初始化操作代码描述

/*  构造一个空栈S */
Status InitStack(LinkStack *S)
{
   
    S->top = (LinkStackPtr)malloc(sizeof(StackNode));
    if(!S->top)
        return ERROR;
    S->top=NULL;
    S->count=0;
    return OK;
}

顺序存储结构进栈操作代码描述

/* 插入元素e为新的栈顶元素 */
Status Push(SqStack *S,SElemType e)
{
   
    if(S->top == MAXSIZE -1) /* 栈满 */
        return ERROR;
	*e=S->data[S->top];
	S->top--;
    return OK;
}

顺序存储结构出栈操作代码描述
顺序存储结构出栈思路

  • 首先设定一个工作结点 p,并且将栈顶结点赋值给它。
  • 然后将栈顶指针下移一位,指向下一结点。代码表示为 S->top=S->top->next;
  • 最后把结点 p free掉,count自减1,完成。
/* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
Status Pop(LinkStack *S,SElemType *e
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值