附录A9实验报告课程:数据结构(c语言)实验名称:栈和队列系别:数字媒体技术实验日期:11月15号专业班级:组别:姓名:学号:实验报告内容验证性实验一、预习准备:实验目的:1.掌握栈的顺序表示、链表表示以及相应操作的实现。特别注意栈空和栈满的条件;2.掌握队列的顺序表示、链表表示以及相应操作的实现。特别是循环队列中队头与队尾指针的变化情况;实验环境:Widows操作系统、VC6.0实验原理:1.定义:栈:只允许在一端插入和删除的线性表,允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom)。队列:是只允许在一端删除,在另一端插入的顺序表,允许删除的一端叫做队头(front),允许插入的一端叫做队尾(rear)。2.特点:栈:后进先出(LIFO)队列:先进先出(FIFO,FirstInFirstOut)3.表示:栈:(1)栈的数组表示—顺序栈(2)栈的链接表示—链式栈队列:(1)队列的顺序存储结构表示——循环队列(2)队列的链式表示—链队列实验内容和要求:分别使用顺序循环队列和堆栈以及链式队列和堆栈编写程序:判断一个字符序列是否是回文。回文是指一个字符序列以中间字符为基准,两边字符完全相同。如:“ABCDEDCBA”。字符串长度小于等于80,用于判断回文的字符串不包括字符串的结束标记符。基本要求:(1)字符序列可由用户从键盘随意输入;(2)可以连续测试多个字符序列,由用户决定退出测试程序;算法思想:判断回文的算法思想是:把字符串中的字符逐个分别存入队列和堆栈中,然后逐个出队列和退栈并比较出队列的数据元素和退栈的数据元素是否相等,若全部相等则该字符序列为回文,否则就不是回文。基本操作:回文判断操作主要包括入栈和入队列、退栈和出队列操作。在对堆栈以及队列进行操作之前,必须对队列以及堆栈进行初始化。若使用链式堆栈和链式队列,操作结束后必须销毁链表。二、实验过程:程序流程图:实验中的关键语句:(1)构造空顺序栈算法StatusInitStack(SqStack&S){S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));if(!S.base)exit(OVERFLOW);S.stacksize=STACK_INIT_SIZE;returnOK;}//InitStack队列(2)顺序栈出栈算法StatusPop(SqStack&S,SElemType&e){if(S.top==S.base)returnERROR;e=*--S.top;returnOK;}//Pop(3)(4)将元素压入顺序栈算法StatusPush(SqStack&S,SElemTypee){if(S.top-S.base=S.stacksize){S.base=(SElemType*)realloc(S.base,(S.stacksixe+STACKINCREMENT*sizeof(SElemType));if(!S.base)exit(OVERFLOW);S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;returnOK;}//Push(4)在顺序队列尾插入新元素算法StatusEnQueue(SqQueue&Q;QElemTypee){if((Q.rear+1)%MAXQSIZE==Q.front)returnERRORQ.base[Q.rear]=e;Q.rear=(Q.rear+1)%MAXQSIZE;returnOK;}//EnQueue(5)在顺序队列头删除旧元素算法StatusDeQueue(SqQueue&Q,QElemType&e){if(Q.front==Q.rear)returnERROR;e=Q.base[Q.front];Q.front=(Q.front+1)%MAXQSIZE;returnOK;}//DeQueue(6)在链式队列尾插入新元素算法StatusEnQueue(LinkQueue&Q;QElemTypee){p=(QueuePtr)malloc(sizeof(QNode));if(!p)exit(OVERFLOW);p-data=e;p-next=NULL;Q.rear-next=p;Q.rear=p;returnOK;}//EnQueue(7)在链式队列头删除旧元素算法StatusDeQueue(LinkQueue&Q,QElemType&e){if(Q.front==Q.rear)returnERROR;p=Q.front-next;e=p-data;Q.front-next=p-next;if(Q.rear==p)Q.rear=Q.front;free(p);returnOK;}//DeQueue编写及调试程序中遇到的问题及解决方法:(1)没有注意到可以验证多次问题。解决:用循环队列(2)程序没错但不能运行。解决:开始时需要初始化栈和队列三、实验总结:1.实验结果及分析:可以看到,程序运用栈和队列不同的结构特点去判断一个字符串是否是回文。先写栈,再写队列,最后调用主函数判断是否回文并输出,运行结果显示可以实现实验要求。2.实验总结:在此次实验中更深刻的理解了栈和队列在实际应用层面的例子,对程序怎么应用在现实生活中有了初步理解,程序与我而言不再是冰冷的字母了,有了自己的意义。我相信多试验对我们以后的专业学习和工作都有帮助。3.思考题:栈和队列都是线性表,都是限制了插入删除点的线性表(或者说是控制了访问点的线性表)。共同点:都是只能在线性表的端点插入和删除。不同点:栈的插入和删除都在线性表的同一个端点,该点通称栈顶,相应地,不能插入删除的另一个端点通称栈底,其特性是后进先出。队列在线性表的表头插入,表尾删除,表头一般称队头,表尾一般称队尾,其特性是先进先出。