栈的链式存储结构及实现

栈的链式存储结构,简称链栈。
链栈的结构代码:

typedef struct StackNode{SElemType data;struct StackNode *next;
}StackNode,*LinkStackPtr;
typedef struct LinkStack{LinkStackPtr top;int count;
}LinkStack;

栈的链式存储结构–进栈(头插法)

Status Push(LinkStack *S,SElemType e){LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode));s->data=e;s->next=S->top;S->top=s;S->cont++;return ok;
}

栈的链式存储结构–出栈

Status Pop(LinkStack *S,SElemType e){LinkStackPtr p;if(StackEmpty(*S))return ERROR;*e=S->top->data;p=S->top;S->top=S->top->next;free(p);S->count--;return OK;
}
栈的作用

佩波纳契数列:如果兔子在出生两个月后,就有繁殖能力,一队兔子每个月能出生一对小兔子,假设所有兔子都不死,那么一年以后可以繁殖对少对兔子。
如图:

可以发现一队兔子经过6个月就变成了8队兔子,用数学函数来定义就是

代码实现如下:

int Fbi(int i){if(i<2)return i=0? 0:1;return Fbi(i-1)+Fbi(i-2);
}

递归的定义:把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称作递归函数。每个递归定义必须至少有一个条件,满足时不再进行,即不再引用自身而是返回值退出
迭代和递归的区别:
1、迭代使用的是循环结构
2、递归使用选择结构

栈的应用–四则表达式

后缀(逆波兰)表达式:一种不需要括号的后缀表达法,称为逆波兰(Reverse Polish Notation,RPN)表达式
如:9 3 1 - 3 * + 10 2 / + 这样的表达式为后缀表达式(所有符号都是在要运算数字的后面),它是由 9 + ( 3 - 1)* 3 +10 / 2 的中缀表达式变换而来。
中缀表达式转后缀表达式
中缀表达式 9 + ( 3 - 1)* 3 +10 / 2 转化为后缀表达式 9 3 1 - 3 * + 10 2 / + 的规则:
从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级不高于栈顶符号(乘除优先加减)则栈顶元素一次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。

队列的定义

队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表
队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。
如图:

队列的抽象数据类型

ADT 队列(Queue)
Data同线性表,元素具有相同的类型,相邻元素具有前驱和后继关系
OperationInilQueue(*Q):初始化操作,建立一个空队列QDestroyQueue(*Q):若队列Q存在,销毁它ClearQueue(*Q):清空队列QQueueEmpty(*Q):若队列Q为空,返回true,否则返回falseGetHead(Q,*e):若队列QQ存在且非空,用e返回队列Q的头元素EnQueue(*Q,e):若队列Q存在,插入新元素e到队列Q中并成为队尾DeQueue(*Q,e):删除队列Q中头元素,并用e返回其值QueueLength(Q):返回队列Q的元素个数
循环队列

定义:头尾相接的顺序存储结构的队列称为循环队列
我们引入两个指针rear、front. rear指针指向队尾元素的下一个位置、front指针指向 队头元素。这样当front=rear时,队列为空。
如图:

循环队列满的条件是:(rear+1) % QueueSize = front 、计算队列长度的公式为:(rear -front + QueueSize) % QueueSize
所以循环队列的实现代码如下:

typedef int QElemType;    //QElemType类型根据实际情况而定,这里假设为int
typedef struct {QElemType data[MAXSIZE];int front;            //头指针int rear;             //尾指针
}SqQueue;

循环结构初始代码如下:

Status InitQueue(SqQueue *Q){Q->front = 0;Q->rear = 0 ;return OK;
}

循环队列的求长度代码

int QueueLength(SqQueue Q){return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;
}

循环队列入队操作

Status EnQueue(SqQueue *Q,QElemType *e){if((Q -> reat+1) % MAXSIZE ==  Q->front )return ERROR;Q->data[Q->rear]=e;Q->rear = (Q->rear + 1) % MAXSIZE;  return OK;
}

循环队列出队操作

Status DeQueue(SqQueue *Q,QElemType *e){if(Q->front == Q -> rear)return ERROR;*e=Q->data[Q->front];Q->front = (Q->front +1 ) % MAXSIZE;   return OK;
}
队列的链式存储结构实现

队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,我们把它简称为链队列。
如图:

链队列结构:

typedef int QElemType;
typedef struct QNode{QElemType data;struct QNode *next;
}QNode,*QueuePtr;
typedef struct{QueuePtr front,rear;
}LinkQueue;

队列的链式存储结构–入队
如图:

Status EnQueue(LinkQueue *Q,QElemType e){QueuePtr s= (QueuePtr) malloc(sizeof(QNode));if(!s)exit(OVERFLOW);s->data=e;s->next=null;Q->rear->next=s;    //把拥有元素e新节点s赋值给原队尾结点的后继Q->rear=s;           //把当前的s设置为队尾结点,rear指向s. return OK;
}

队列的链式存储结构–出队操作
如图:

代码如下:

Status DeQueue(LinkQueue *Q,QElemType *e){QueuePtr p;if(Q->front == Q->rear)return ERROR;p=Q->front->next;*e=p->data;Q->front->next = p ->next;if(Q->rear == p)Q->rear = Q->front;free(p);return OK;
}

总结
1、栈(stack)是限定仅在表尾进行插入和删除操作的线性表:顺序栈、链栈
2、队列(queue)是只允许在一端进行插入操作,一端进行删除操作的线性表:顺序队列、链队列

第三章 栈与队列(二)相关推荐

  1. (王道408考研数据结构)第三章栈和队列-第三节1:栈的应用之括号匹配问题和表达式问题(前缀、中缀和后缀)

    前面我们就说过,栈是一种先进后出的线性表,这种先进后出的特性就决定了它在一类场合或问题中会经常被用到--递归.考研数据结构中所涉及的利用栈结构解决递归问题或者考察栈结构特性的问题主要有这么几类 括号匹 ...

  2. C语言数据结构-第三章栈和队列-电大同步进度

    第三章栈和队列简介 从数据结构角度看,栈和队列是两种重要的线性结构,是一类操作受限制的特殊线性表,其特殊性在于限制插入和删除等运算的位置. 堆栈,限制用户只能在指定的一端插入和删除元素,因此具有后进先 ...

  3. 王道考研408 数据结构 第三章 栈、队列与数组

    第三章 栈.队列与数组 3.1 栈 3.1.03 假设以I和O分别表示入栈和出栈操作.栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由I和O组成的序列,称可以操作的序列为合法序列,否则称为非法序 ...

  4. 数据结构-第三章-栈和队列(5)-链队

    数据结构 ⚡️数据结构-第一章 ⚡️抽象数据类型案例 ⚡️数据结构-第二章(1)-线性结构 ⚡️数据结构-第二章(2)-线性表的顺序表示和实现 ⚡️数据结构-第二章(3)-顺序表(含代码) ⚡️数据结 ...

  5. 第三章栈和队列-作业题

    第三章栈和队列-作业题 1.栈和列队的基本概念 6-1 使用栈完成回文判断 (12 分) 6-2 判断表达式中括号是否匹配 (12 分) 6-3 队列的操作集合(带尾指针的循环链表) (18 分) 6 ...

  6. C语言数据结构【手抄版】第三章 栈和队列

    注意:文中彩色代码均在Visual Studio 2022编译器中编写,本文为C语言数据结构手抄版,文中有部分改动,非原创. 目录 注意:文中彩色代码均在Visual Studio 2022编译器中编 ...

  7. 第三章 栈、队列和数组

    3_1 03.判断操作序列是否合法,合法,返回true,否则返回false bool judge(char A[])//A[]用来存放字符数组 {int i=0;//用于扫描字符数组int j=k=0 ...

  8. (王道408考研数据结构)第三章栈和队列-第一节:栈基本概念、顺序栈和链栈基本操作

    文章目录 一:栈基本概念 (1)栈的定义 (2)压栈和出栈 (3)进栈出栈变化形式 (4)栈的操作 二:栈的顺序存储结构及其操作实现 (1)顺序栈的定义 (2)进栈 (3)出栈 (4)读取栈顶元素 ( ...

  9. 王道数据结构课代表 - 考研数据结构 第三章 栈和队列 究极精华总结笔记

    本篇博客是考研期间学习王道课程 传送门 的笔记,以及一整年里对数据结构知识点的理解的总结.希望对新一届的计算机考研人提供帮助!!!   关于对 栈和队列 章节知识点总结的十分全面,涵括了<王道数 ...

最新文章

  1. 【NOIP2015模拟10.22】矩形
  2. 新年快乐,送一台新款华为笔记本!
  3. c语言socket段错误,(Qtcpsocket)退出程序时提示段错误的解决
  4. Javascript:运行机制与原理
  5. 软考高项范文——论信息系统项目的成本管理
  6. 手机QQ邮箱登录不上的解决办法
  7. html遮罩点击,点击按钮实现遮罩效果
  8. 宝付揭秘高炮贷款借贷渠道
  9. android手机变微软手机号码,微软Your Phone未来将能让你用电脑远程控制拨打Android手机电话...
  10. nmcli命令详解>>>创建热点,连接wifi,管理连接等
  11. kettle入门(二) 之 kettle连接oracle报的坑爹错误 Error occured while trying to connect to the database 的几种情况
  12. Bilibili for mac 2019 - 国内知名的视频弹幕社区软件(b站)
  13. VS打开后界面找不到win32或者x64的选项怎么办?
  14. char在struct中到底占几个字节!!
  15. 第十三周项目一(4)——验证平衡二叉树相关算法
  16. SQL Server2012下载
  17. Java 应用容器化最佳实践
  18. 2021-11-11SR-DRN
  19. 2020年江苏省计算机一级答案,2020年江苏省计算机等级考试一级理论题汇编汇编.doc...
  20. 《都挺好》:你对硅谷程序员是不是有什么误解?

热门文章

  1. tk.mybatis的批量插入扩展
  2. CC防御过程中,WAF的主要特点有哪些?
  3. 15【存储过程和存储函数】
  4. 到底vuex是什么?
  5. PTA(三十)面向对象程序设计 第五章 作业 7-1 复数的比较 (30 point(s))
  6. 快捷生成HTML代码的实现
  7. 命令行退出python方法
  8. Pytorch基础操作 —— 6. 如何使用自定义数据集
  9. 素数的定义法判断(含C++代码)
  10. Exynos_4412——IIC总线概述