数据结构(C语言第二版)严蔚敏编,数据结构电子教材,线性表,栈,队列,顺序存储结构,初始化,入栈,出栈,入队,出队,c++
·
前言
提示:本篇文章收录严蔚敏编写的数据结构C语言版本
简单介绍一下顺序表,顺序栈,循环队列,的顺序存储结构之间的区别
代码参考严蔚敏编写的《数据结构》,二维码动态演示可扫码可观看。
—
提示:结合教材更容易理解
一、代码的宏定义、重定义、名称解释。
代码如下(示例):
#include<iostream>
#define OK 1 //算法成功实现返回1
#define ERROR -1 //算法错误返回-1
#define OVERFLOW -2 //错误返回值
#define MAXSIZE 100 //数组最大容量
using namespace std; // c++
typedef int Status; //重命名 int为Status
typedef char Elemtype; //重命名 cahr为Elemtype(元素类型)
SqList代表顺序表,SqStack代表顺序栈,SqQueue代表顺序队列
二、三种线性表
顺序表、顺序栈、循环链表五个算法
1.顺序存储结构
代码如下(示例):
typedef struct { //顺序表存储结构
Elemtype * elem; //数组基地址 a[0]中a的地址
int length; //顺序表表长
}SqList; //顺序表的结构类型为SqList
typedef struct { //顺序栈存储结构
Elemtype *base; // 栈底指针,指向栈底不变化
Elemtype *top; //栈顶指针 只移动栈顶指针,top++ top--
int Stacksize; //栈的最大容量
}SqStack;
typedef struct { //循环队列顺序存储结构
Elemtype *base; //基地址 a[10]的a
int front; //头指针 处理出队操作
int rear; //尾指针 处理入队操作
}SqQueue;
2.初始化
代码如下(示例):
Status Initlist(SqList &l ){ //顺序表初始化
l.elem=new Elemtype [MAXSIZE]; //申请elem[100]
if(!l.elem) return ERROR; // 申请失败退出
l.length=0; // 表长值为0
return OK;
}
Status Initstack(SqStack &s){ //顺序栈初始化
s.base =new Elemtype [MAXSIZE]; //申请char base[100]
if(!s.base) return ERROR; //申请失败退出
s.base=s.top; //空栈
s.Stacksize=MAXSIZE; //把最大容量赋值给Stacksize
return OK;
}
Status Initqueue(SqQueue &Q){ //循环队顺序存储列初始化
Q.base=new Elemtype [MAXSIZE]; //申请char base[100]
if(!Q.base) return ERROR; //申请失败退出
Q.front=Q.rear=0; //空队列
return OK;
}
顺序表初始化(教材25页)

顺序栈初始化(教材58页)

循环队列(教材71页)

3.插入,入栈,入队
代码如下(示例):
Status Inserlist(SqList &l,int i,Elemtype e){ //顺序表插入元素
if((i<1)||(i>l.length+1)) return ERROR; // 判断插入位置是否合理
if(l.length==MAXSIZE) return ERROR; //判断表是否已满
for(int j=l.length-1;j>=i-1;j--) //依次从length-1后移覆盖元素
l.elem[j+1]=l.elem[j]; //覆盖
l.elem[i-1]=e; //存放插入元素给e
l.length++; //表长加一
return OK;
}
Status Push(SqStack &s,Elemtype e){ //顺序栈入栈,不需要int i,只能在top操作
if(s.top-s.base==s.Stacksize)
return ERROR; //判断是否栈满
*s.top=e; //保存元素a[top]=e
s.top++; //头指针加一top++
return OK; //
}
Status Enqueue(SqQueue &Q,Elemtype e){//循环队列入队,没有int i,rear队尾入队
if((Q.rear+1)%MAXSIZE==Q.front) //判断
return ERROR;
Q.base[Q.rear]=e; // a[rear]=e
Q.rear=(Q.rear+1)%MAXSIZE; //指向下一个元素
return OK;
}
一般顺序表插入(教材27页)

动态演示:插入、入栈、入队(59/72页)

4.删除,出栈,出队
代码如下(示例):
Status ListDelete(SqList &L,int i){ //顺序表的删除,传入删除位置i
if((i<1)||(i>L.length)) //删除位置是否合理
return ERROR;
for(int j=i;j<=L.length-1;j++) //未删除元素依次先前覆盖元素
L.elem[j-1]=L.elem[j]; //elem[i+1]覆盖elem[i]达到删除目的
L.length--; //表长减一
return OK;
}
Status Pop (SqStack &S,Elemtype &e){ //顺序栈的出栈
if(S.top==S.base) return ERROR; //判空
e=*S.top; //用e返回删除元素的值
--S.top; //栈顶指针减一
return OK;
}
Status DeQueue(SqQueue &Q,Elemtype &e){ //循环队列的出队
if(Q.rear==Q.front) return ERROR; //判空
e=Q.base [Q.front]; //用e返回删除元素的值
Q.front=(Q.front+1)%MAXSIZE; //栈顶指针指向上一个
return OK;
}
动态演示:删除、出栈、出队(29/59/72页)

5.取值
代码如下(示例):
Elemtype Getelem(SqList L,int i,Elemtype &e){ //顺序表的取值,i的位置
if(i<1||i>L.length) return ERROR; //判断位置是否合理
if(L.length!=0) //判断是否为空
return e=L.elem[i-1]; //用e返回第i个元素的值elem[i-1]
}
Elemtype GetTop(SqStack S){ //顺序栈取值栈顶元素
if(S.base!=S.top) //栈非空
return *(S.top-1); //返回栈顶元素的值,栈顶指针不变,top--
}
Elemtype GetTop(SqQueue Q){ //循环队列的取值
if(Q.front!=Q.rear) //判空
return Q.base[Q.front]; //返回队列顶部元素
}
动画演示:取值(26、59、73页)

三、电子教材
网盘链接:https://pan.baidu.com/s/1IO3oDVsXxrhWLkndDwGcvw?pwd=8888
提取码:8888
四、总结
对三种顺序存储结构的总结归纳横向对比
本篇文章归纳了《数据结构》严蔚敏编写的C语言第二版中一、二、三章节的顺序存储结构的线性表,如:顺序表,顺序栈,顺序队列的结构定义、初始化、元素插入、元素删除、元素取值的基本操作。
想要实现脱离教材,实现代码,少不了自己动手编写代码,首先要领会教材的算法的每一个步骤,多画图理解,观看动画演示。
今天的分享就到这里啦,喜欢的小伙伴可以点赞收藏。
更多推荐
所有评论(0)