数据结构实验报告二
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实验报告
(实验名称)
1.实验目标
熟练掌握栈的顺序存储结构和链式存储结构。
熟练掌握栈的有关算法设计,并在顺序栈和链栈上实现。
根据具体给定的需求,合理设计并实现相关结构和算法。
2.实验内容和要求
内容:通过顺序栈和链栈结构设计并实现一个顺序栈,编写算法实现下列问题的求解。
<1>利用顺序栈实现将10进制数转换为16进制数。
第一组数据:4
第二组数据:11
第三组数据:254
第四组数据:1357
<2>对一个合法的数学表达式来说,其中的各大小括号“{”,“}”,“[”,“]”,“(”和“)”应是相互匹配的。设计算法对以字符串形式读入的表达式S,判断其中的各括号是否是匹配的。
要求:顺序栈的实验要求
顺序栈结构和运算定义,算法的实现以库文件方式实现,不得在测试主程序中直接实现;
实验程序有较好可读性,各运算和变量的命名直观易懂,符合软件工程要求;
程序有适当的注释。
链栈实验要求
本次实验中的链栈结构指带头结点的单链表;
链栈结构和运算定义,算法的实现以库文件方式实现,不得在测试主程序中直接实现;
实验程序有较好可读性,各运算和变量的命名直观易懂,符合软件工程要求;
程序有适当的注释。
3.数据结构设计
顺序栈,链栈。
4.算法设计
(除书上给出的基本运算(这部分不必给出设计思想),其它实验内容要给出算法设计思想)
进制转换:先在函数中定义一个栈然后初始化栈,通过循环对x求余数,将余数放入栈中,循环取出栈中的元素,并判断其值,用switch-case,10-A,11-B,12-C,13-D,14-E,15-F。
判断符号是否配对:通过函数将栈传入,将栈中的元素放到一个数组中,然后通过循环给数组中的符号对应相反数数字,如“(”-1,“)”-(-1)。判断是否合法时,将整数数组遍历相加,若和为0 ,表达式合法,若和不为0则不合法。
5.运行和测试
顺序栈:
1,
2,
链栈:1,
2
6.总结和心得
通过本次实验,很多东西还为掌握,要是不是的查书,查书时总结了一下内容栈是限定尽在表尾进行插入或者删除操作的线性表。因此,对栈来说,表尾端有其特殊含义,称为栈顶,相应地,表头端称为栈底。不含元素的空表称为空栈。栈又称为后进先出的线性表。
和线性表类似,栈也有两种存储表示方法。
顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到
栈顶的数据元素,同时附设指针top只是栈顶元素在顺序栈中的位置。这里以top=-1表示空栈。
链式栈可以通过单链表的方式来实现,使用链式栈的优点在于它能够克服用数组实现的顺序栈空间利用率不高的特点,但是需要为每个栈元素分配额外的指针空间用来存放指针域。
总结了相关运算:
/顺序栈定义
typedef struct SqStack
{
int data[20];
int top;
}SqStack;
//链栈结点定义
typedef struct LNode
{
int data;
struct LNode *next;
}LNode;
//初始化顺序栈
void initStack(SqStack &st)
{
st.top = -1;
}
//判断顺序栈空
int isEmpty(SqStack st)
{
if(st.top == -1)
return 1;
else
return 0;
}
//顺序栈进栈
int push(SqStack &st,int x)
{
if(st.top==20)
{
return 0;
}
else
{
st.data[++st.top]=x;
return 1;
}
}
//顺序栈出栈
int pop(SqStack &st,int &x) {
if(isEmpty(st))
{
return 0;
}
else
{
x = st.data[st.top--]; return 1;
}
}
//初始化链栈
void initLNodeStack(LNode *&L) {
L = new LNode;
L->next = NULL;
}
//链栈判断栈空
int isLNodeEmpty(LNode *L)
{
if(L->next == NULL)
return 1;
else
return 0;
}
//链栈进栈
void pushLNode(LNode *&L,int x) {
LNode *p = new LNode;
p->data = x;
p->next = L->next;
L->next = p;
}
//链栈出栈
int popLNode(LNode *&L,int &x)
{
if(isLNodeEmpty(L))
{
return 0;
}
else
{
LNode *p = new LNode;
p = L->next;
L->next = p->next;
x = p->data;
delete p;
return 1;
}
}
[7. 附录]
(源代码清单。纸质报告不做要求。电子报告,可直接附源文件,删除编译生成的所有文件)
way.cpp main.cpp stack.h
main.cpp stackNode.h way.cpp