回文序列判断(运用栈以及队列完成)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

回文序列判断实验报告

系别:通信工程

班级:0905班

学号:18 号

1.实验目的:熟悉栈的各项操作

2.实验内容:

利用栈的操作完成读入的一个以@结尾的字符序列是否是回文序列的判断.

回文序列即正读与反读都一样的字符序列;

例如:123&321@是;

123&4321@、123&312@不是

算法思想:从键盘上读取一个字符,同时存储在顺序栈与链队列之中,直到字符序列的最后一个字符为@停止输入,因为要满足特定的要求:序列1&序列2,故设置夜歌标记量falg=1,判断输入的元素个数是否为奇数个,若为偶数个则令flag=0,若为奇数个继续判断栈的中间元素是否为&,若不是则令flag=0,若是,将栈和队列中的元素依次出列,判断是否相等,若不相等则令flag=0,最后将flag的值返回给主函数,若flag被修改为0说明不是回文序列,否则反之!!

判断回文序列的流程图:

3.实验感想与体会

通过本次的上机,对栈的各项基本操作都有了更好的掌握,同时明白了一些小的细节问题可能会影响到整个程序的正确的运行,本次的实验我通过了运用栈和队列,可以说对队列的一些基本的操作也得以了巩固和提高!更加体会到,自己写程序上机操作的重要性,它要比课本上学的要多得多!

4.附录(源代码及运行图)

#include

#define MAX 100

typedef struct//栈结构体

{

char e[MAX];

int top;

}SeqStack;

typedef struct NODE//队列结构体

{

char d;

struct NODE *next;

}LinkQN;

typedef struct//封装头指针为指针

{

LinkQN *front;

LinkQN *rear;

}LinkQ;

InitS(SeqStack *s)//初始化顺序栈

{

s->top=-1;

}

int push(SeqStack *s,char ch)//入栈

{

if(s->top==MAX-1)

return(0);

s->top++;

s->e[s->top]=ch;

return(1);

}

int pop(SeqStack *s,char *x)//出栈

{

if(s->top==-1)

return(0);

*x=s->e[s->top];

s->top--;

return(1);

}

void InitQ(LinkQ *q)//链队列初始化

{

q->front=(LinkQN *)malloc(sizeof(LinkQN));

if(!q->front)

{

printf("分配空间失败!");

}

q->rear=q->front;

q->front->next=NULL;

}

int enter(LinkQ *q,char ch)//入队

{

LinkQN *np;

np=(LinkQN *)malloc(sizeof(LinkQN));

if(!np)

return(0);

np->d=ch;

np->next=NULL;

q->rear->next=np;

q->rear=np;

return(1);

}

int deleteq(LinkQ *q,char *c)//出队

{ LinkQN *p;

if(q->front==q->rear)

return(0);

p=q->front->next;

q->front->next=p->next;

if(q->rear==p)

q->rear=q->front;

*c=p->d;

free(p);

return(0);

}

int huiwen(SeqStack *s,LinkQ *q)//回文判断

{

int flag=1,m=0,t=1;

int i;

char ch1,ch2,ch;

InitS(&s);

InitQ(&q);

printf("请输入字符序列当输入字符@时输入结束:\n");

while(ch!='@')

{

ch=getch();

if(ch!='@')

{ printf("%c",ch);

push(&s,ch);

enter(&q,ch);

m++;

}

}

printf("\n输入完成!\n");

printf("按任意键予以判断!\n");

getch();

if(m%2)

{

if(s->e[m/2]=='&')

{

for(i=1;i<(m+1)/2;i++)

{

pop(&s,&ch1);

deleteq(&q,&ch2);

if(ch1!=ch2)

相关文档
最新文档