数据结构实验报告 回文判断 班 级 : 学 号 : 学生 姓 名 : 指 导 教 师 : 时间 : 2015 年 5 月 5 日 1.实验目的:熟悉栈和队列的各项操作,区别栈和队列的操作原理。 2.实验内容: 利用栈的操作完成读入的一个以@结尾的字符序列是否是回文序列的判断. 回文序列即正读与反读都一样的字符序列; 例如:123&321@是; 123&4321@、123&312@不是 算法思想:从键盘上读取一个字符,同时存储在顺序栈与链队列之中,直到字符序列的最后一个字符为@停止输入,因为要满足特定的要求:序列1&序列2,故设置夜歌标记量 falg=1,判断输入的元素个数是否为奇数个,若为偶数个则令 flag=0,若为奇数个继续判断栈的中间元素是否为&,若不是则令 flag=0,若是,将栈和队列中的元素依次出列,判断是否相等,若不相等则令 flag=0,最后将 flag 的值返回给主函数,若 flag 被修改为 0 说明不是回文序列,否则反之!! 判断回文序列的流程图: 算法实现: (1)v oid InitStack(SeqStack *s):栈初始化模块,即初始化一个空栈,随后对该空栈进行数据的写入操作; (2)int pu sh(SeqStack *s,char ch):入栈操作,即给空栈中写入数据; (3)int pop(SeqStack *s,char *x ):出栈操作,即将栈中的数据输出,由于栈的操作是先进后出,因此,出栈的数据是原先输入数据的逆序; 初始化栈InitS(&s) 初始化队列InitQ(&q) 当 ch!='@'时 ch=getch() Y ch!='@' N printf("%c",ch) pu sh(&s,ch) enter(&q,ch) m++ Y m%2!=0 N Y s->e[m/2]=='&' N flag=0 i=1 当 i<(m+1)/2 时 flag pop(&s,&ch1) =0 deleteq(&q,&ch2) Y ch1!=ch2 N flag=0 i++ retu n(flag) (4)void InitQuene(LinkQ *q):队列初始化,即初始化一个空队列,最后对该空队列进行数据的写入操作; (5)int enter(LinkQ *q,char ch):入队操作,即给空队列中写入数据; (6)int deleteq(LinkQ *q,char *c):出队操作,即将队列中的数据输出,由于队列的操作是先进先出,因此,出队的数据室原先输入数据的正序; (7)int huiwen(SeqStack s,LinkQ q):输入序列并判断所输入的序列是否是回文序列; (8)void main():主函数,用于调用前面的模块,并输出最终的判断结果。 3 .实验感想与体会 通过本次的上机,对栈的各项基本操作都有了更好的掌握,同时明白了一些小的细节问题可能会影响到整个程...