当前位置:文档之家› 数据结构实验二——顺序栈,链栈,循环队列,链队列

数据结构实验二——顺序栈,链栈,循环队列,链队列

构造空栈:malloc分配内存;
判断是否分配失败,失败则exit
S.top=S.base;初始化栈顶
初始化存储容量
置空栈:S.top=S.base;栈顶重新指向栈底
判栈空:if(S.top==S.base);
判栈满:if(S.top-S.base>=S.stacksize);看栈首尾差距是否>=栈当前存储大小
实验报告二
实验课名称:数据结构与程序设计实验
实验名称:顺序栈,链栈,循环队列,链队列
班级:
学号:
姓名:
时间:
一、问题描述
(1)顺序栈
顺序栈的C语言描述
基本运算的算法——置空栈、判栈空、进栈、出栈、读栈顶、输出栈、判栈满
(2)链栈
链栈的C语言描述
基本运算的算法——置空栈、判栈空、进栈、出栈、读栈顶
(3)循环队列
循环队列的C语言描述
基本运算的算法——置空队、判队空、进队、出队、读队头元素、输出循环队列
(4)链队列
链队列的C语言描述
基本运算的算法——置空队、判队空、进队、出队、读队头元素
二、数据结构设计
1.顺序栈
typedef struct{ //定义栈的数据结构
SElemType *base; //栈底指针
3.循环队列
typedef struct{
QElemType *base;
int rear;//队尾
int front;//队首
int count;//队内元素数目
int size;//队列存储大小
}sqQueue;
为了方便循环队列判定队满队空,故加了一个数据域存储当前元素个数。
4.链队列
typedef struct QNode{//结点结构体
SElemType *top; //栈顶指针
int stacksize; //栈当前存储大小
}sqstack;
2.链栈
typedef struct StackNode{
SElemType data;//数据域
struct StackNode *next;//结点指针
}StackNode,*LinkStack;
将队首指向空
置空队列:
判空队列:if(!Q.front->next)
入队:分配新结点q的内存
判q空,若空则exit
q的数据域赋值给e
q指向空
队尾指向q
出队:判空,若空返回error
定义p并赋值为队首结点
将其数据赋值给e
将队首指向p的下一个
判队尾是否为p,若为则将队首赋给队尾
释放p
读取队头元素:判空,若空返回error
p指向新结点
新节点指向空
出栈:判栈空,若空返回error
定义结点指针p和q,通过while(p->next)循环使p指向栈顶,q指向栈顶前一个
把p的数据域赋值给e
释放p
q的指针指向空
读取栈顶元素:判栈空,若空返回error
定义结点指针p,通过while(p->next)循环使其指向栈顶结点
把p的数据域赋值给e
3)循环队列
构造空队列:malloc分配内存;
判断是否分配失败,失败则exit
初始化队首、队尾、队内元素个数为0
初始化队列存储空间
置空队列:将队首、队尾、队内元素个数重新置0
判空队列:if(Q.count==0)
入队:判队满,若满,realloc重新分配内存
if判断是否分配成功,不成功则退出
更新队列存储的值
进栈:判栈满;若满realloc重新分配内存
判断是否分配失败,失败则exit
S.top=S.base+S.stacksize;赋值新栈顶
S.stacksize+=stackincrement;赋值给新的当前存储大小
*S.top++=e;进栈元素赋值给top后,top上移
出栈:判栈空,若空返回error
队尾赋值为e
队尾后移
队列元素个数加1
出对:判队空,若空则返回error
取队首元素
队首后移
队内元素个数减1
读取队头元素:判队空,若空则返回error
队首的值赋值给e
输出队列:for循环输出队首,循环次数为队内元素个数
每循环一次,队首后移
4)链队列
构造空队列:malloc分配队首队尾指针同一内存
判空,若空则exit

链队列
5
1 2 3 4 5
5
5
队列为空

六、实验收获与思考
1.因为做的是验证型的实验,所以完成后对顺序栈、链栈、循环队列和链队列的数据结构有了更加清晰的了解,对他们所涉及到的基本的一些操作也熟悉了很多;
2.加的注释比之前要合理一些
3.写代码的速度有所提高
4.注意到了回车键会干扰到字符型数据的输入,采用getchar()吞掉了
置空栈:暂存S的下一个节点指针到p
while(p)循环q=p把p赋值给q
p=p->next;p指向下一个
释放q
通过该循环则从第一个结点开始逐个释放到最后一个
进栈:定义结点指针p,通过while(p->next)循环使其指向栈顶结点
malloc分配结点内存;
判断是否分配失败,失败则exit
新节点的数据域赋值e;
QElemType data;//数据域
struct QNode *next;//指针域
}QNode,*QueuePtr;//结点,节点指针
typedef struct{//队列结构体
QueuePtr front;//头指针
QueuePtr rear;//尾指针
}LinkQueue;
三、算法设计
1)顺序栈
将队首下一个结点
2.链栈
3.循环队列
5.链队列
五、运行测试与分析
输入
输出
实际
顺序栈
5
asdfg
g f d s a
g
栈不为
g
f d s a
(因置空没有数据显示)

链栈
5
asdfg
g
g
栈为空

循环队列
5
5 4 3 2 1
5 4 3 2 1
5
5
4 3 2 1
(因置空没有数据显示)
教师评分:
教师签字:
e=*--S.top;,下移top指针后赋值给e
读取栈顶元素:判栈空,若空返回error
e=*(S.top-1);顶元素赋值给e
输出栈:for循环输出,须满足条件top>base
2)链栈
构造空栈:malloc分配内存;
判断是否分配失败,失败则exit
S->next=NULL;使指针指向空
判栈空:if(!S->next)判断s是否指向空指针
相关主题