C++ 数据结构 2:栈和队列
2021-04-07 19:25
标签:链栈 get 利用 示例 顺序栈 typedef lazy 顺序存储 单元 栈(stack)又名堆栈,它是一种 运算受限的线性表。限定 仅在表尾进行插入和删除操作 的线性表。表尾被称为栈顶,相对地,把另一端称为栈底。 它的特殊之处在于限制了这个线性表的插入和删除的位置,它始终只在栈顶进行。这也就使得:栈底是固定的,最先进栈的只能在栈底。 创建栈 销毁栈 清空栈 进栈 出栈 获取栈顶元素 获取栈的大小 基本概念: 栈的顺序存储结构简称顺序栈,它是运算受限制的顺序表。顺序栈的存储结构是:利用一组地址连续的的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top只是栈顶元素在顺序表中的位置。 栈是先进后出的线性表。 因为栈是一种特殊的线性表,所以栈的顺序存储可以通过顺序线性表来实现。 示例代码: SqStack.h SqStack.c main.c 运行结果: 栈的链式存储结构简称链栈。 链栈是一种特殊的线性表,链栈可以通过链式线性表来实现。 示例代码: LinkStack.h LinkStack.c main.c 运行结果: 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。 队列是先进先出的线性表。 在队尾添加元素,在队头删除元素。 判断队列是空队列还是已满呢? 栈空: 队首标志 = 队尾标志时,表示栈空。 栈满 : 队尾 + 1 = 队首时,表示栈满。 创建队列 销毁队列 清空队列 进队列 出队列 获取队头元素 获取队列的长度 队列也是一种特殊的线性表;可以用线性表顺序存储来模拟队列。 示例代码: SqQueue.h SqQueue.c main.c 运行结果: 队列也是一种特殊的线性表;可以用线性表链式存储来模拟队列的链式存储。 示例代码: LinkQueue.h LinkQueue.c main.c 运行结果: C++ 数据结构 2:栈和队列 标签:链栈 get 利用 示例 顺序栈 typedef lazy 顺序存储 单元 原文地址:https://www.cnblogs.com/PikapBai/p/13374079.html1 栈
1.1 栈的基本概念
1.1.1 特点
1.2 栈的常用操作
1.2.1 栈的抽象数据类型
ADT 栈(stack)
Data
通线性表。元素具有相同的类型,相邻的元素具有前驱和后继关系。
Operation
// 初始化,建立一个空栈S
InitStack(*S);
// 若栈存在,则销毁它
DestroyStack(*S);
// 将栈清空
ClearStack(*S);
// 若栈为空则返回true,否则返回false
StackEmpty(S);
// 若栈存在且非空,用e返回S的栈顶元素
GetTop(S,*e);
// 若栈S存在,插入新元素e到栈S中并成为其栈顶元素
Push(*S,e);
// 删除栈S中的栈顶元素,并用e返回其值
Pop(*S, *e);
// 返回栈S的元素个数
StackLength(S);
endADT
1.3 栈的顺序存储
1.3.1 基本概念
1.3.2 设计与实现
#ifndef _SQSTACK_H
#define _SQSTACK_H
#define MAXSIZE 50
typedef int EnumType;
typedef struct _SQSTACK
{
int top; // 栈顶指针
EnumType data[MAXSIZE];
}SqStack;
// 初始化,建立一个空栈S
void InitStack(SqStack *S);
// 将栈清空
void ClearStack(SqStack *S);
// 若栈为空则返回true,否则返回false
int StackEmpty(SqStack S);
// 若栈存在且非空,用e返回S的栈顶元素
void GetTop(SqStack S, EnumType *e);
// 若栈S存在,插入新元素e到栈S中并成为其栈顶元素
void Push(SqStack *S, EnumType e);
// 删除栈S中的栈顶元素,并用e返回其值
void Pop(SqStack *S, EnumType *e);
// 返回栈S的元素个数
int StackLength(SqStack S);
#endif // _SQSTACK_H
#include "SqStack.h"
#include
#include "SqStack.h"
#include
1.4 栈的链序存储
1.4.1 基本概念
1.4.2 设计与实现
#ifndef _LINKSTACK_H
#define _LINKSTACK_H
// 定义小链表节点
typedef struct NODE
{
struct NODE* next;
}Node;
// 链表结构体
typedef struct
{
// 栈顶指针
Node *top;
// 长度
int length;
}LinkStack;
// 初始化,建立一个空栈S
void InitStack(LinkStack *S);
// 将栈清空
void ClearStack(LinkStack *S);
// 若栈为空则返回true,否则返回false
int StackEmpty(LinkStack S);
// 若栈存在且非空,用e返回S的栈顶元素
void GetTop(LinkStack S, Node **e);
// 若栈S存在,插入新元素e到栈S中并成为其栈顶元素
void Push(LinkStack *S, Node *e);
// 删除栈S中的栈顶元素,并用e返回其值
void Pop(LinkStack *S, Node **e);
// 返回栈S的元素个数
int StackLength(LinkStack S);
#endif // _LINKSTACK_H
#include "LinkStack.h"
#include
#include
2 队列
2.1 基本概念
2.1.1 特点
2.2 队列的常用操作
2.2.1 队列的抽象数据类型
ADT 队列(Queue)
Data
通线性表。元素具有相同的类型,相邻元素具有前驱后继关系。
Operation
// 初始化操作,建立一个空队列Q
InitQueue(*Q);
// 若队列Q存储,则销毁它。
DestroyQueue(*Q);
// 将队列Q清空
ClearQueue(*Q);
// 若队列为空则返回true,否则返回false
QueueEmpty(Q);
// 若队列Q存在且非空,用e返回队列Q的队头元素
GetHead(Q, *e);
// 若队列Q存在,插入新元素e到队列Q中并成为队尾元素。
EnQueue(*Q, e);
// 删除队列Q中的队头元素,并用e返回其值
DeQueue(*Q, *e);
// 返回队列Q的元素个数
QueueLength(Q);
endADT
2.3 队列顺序模型和链表模型关系分析
2.4 队列的顺序存储
2.4.1 基本概念
2.4.2 设计与实现
#ifndef _SQQUEUE_H
#define _SQQUEUE_H
#define MAXSIZE 50
typedef int EnumType;
typedef struct _SQQUEUE
{
// 尾节点指针
int rear;
// 头结点指针
int front;
EnumType data[MAXSIZE];
}SqQueue;
// 初始化操作,建立一个空队列Q
void InitQueue(SqQueue *Q);
// 将队列Q清空
void ClearQueue(SqQueue *Q);
// 若队列为空则返回true,否则返回false
int QueueEmpty(SqQueue Q);
// 若队列Q存在且非空,用e返回队列Q的队头元素
void GetHead(SqQueue Q, EnumType* e);
// 若队列Q存在,插入新元素e到队列Q中并成为队尾元素。
void EnQueue(SqQueue *Q, EnumType e);
// 删除队列Q中的队头元素,并用e返回其值
void DeQueue(SqQueue *Q, EnumType* e);
// 返回队列Q的元素个数
int QueueLength(SqQueue Q);
#endif //_SQQUEUE_H
#include "SqQueue.h"
#include
#include "SqQueue.h"
#include
2.5 队列的链序存储设计与实现
2.5.1 基本概念
2.5.2 设计与实现
#ifndef _LINKQUEUE_H
#define _LINKQUEUE_H
typedef struct _NODE
{
struct _NODE* next;
}Node;
typedef struct
{
// 长度
int length;
// 尾节点指针
Node *rear;
// 头结点指针
Node *front;
}LinkQueue;
// 初始化操作,建立一个空队列Q
void InitQueue(LinkQueue *Q);
// 将队列Q清空
void ClearQueue(LinkQueue *Q);
// 若队列为空则返回true,否则返回false
int QueueEmpty(LinkQueue Q);
// 若队列Q存在且非空,用e返回队列Q的队头元素
void GetHead(LinkQueue Q, Node** e);
// 若队列Q存在,插入新元素e到队列Q中并成为队尾元素。
void EnQueue(LinkQueue *Q, Node* e);
// 删除队列Q中的队头元素,并用e返回其值
void DeQueue(LinkQueue *Q, Node** e);
// 返回队列Q的元素个数
int QueueLength(LinkQueue Q);
#endif //_LINKQUEUE_H
#include "LinkQueue.h"
#include
#include "LinkQueue.h"
#include
下一篇:Spring——初识