数据结构--关于用队列实现形如a+b@b+a#字符序列的检验,程序进行要要检验一步就不运行了,求帮忙看看代码哪里有问题!!

up___lqw 2020-12-21 07:39:33
#include <stdio.h>
#include <stdlib.h>
#define MAXQSIZE 100
#define ERROR 0
#define OK 1
typedef struct{
char *base;
int front;
int rear;
}SqQueue;

void InitQueue(SqQueue *Q) //建立顺序队列
{
Q->base=(char*)malloc(MAXQSIZE*sizeof(char));
if(!Q->base) exit(1);
Q->front=Q->rear=0;
}

int EnQueue(SqQueue *Q,char e)
{
if((Q->rear+1)%MAXQSIZE==Q->front) return ERROR; //队列满条件
Q->base[Q->rear]=e;
Q->rear=(Q->rear+1)%MAXQSIZE;
return OK;
}

int DeQueue(SqQueue *Q,char *e) //从队列头删除一个元素
{
if(Q->front==Q->rear) return ERROR; //队列空条件
*e=Q->base[Q->front];
Q->front=(Q->front+1)%MAXQSIZE;
return OK;
}

int DeQueue_rear(SqQueue *Q,char *e) //从队列尾删除一个元素
{
if(Q->front==Q->rear) return ERROR; //队列空
*e=Q->base[Q->rear];
Q->rear=(Q->rear-1)%MAXQSIZE;
return OK;
}

int GetHead(SqQueue Q,char *e)
{
if(Q.front==Q.rear) return ERROR; //队列空
*e=Q.base[Q.front];
return OK;
}

int QueueLength(SqQueue *Q)
{
return (Q->rear-Q->front+MAXQSIZE)%MAXQSIZE;
}

int CheckSymmetry(SqQueue *Q,char ch[])
{
InitQueue(Q);
int i=0;
char *e,*c;
while(ch[i]!='@') //@前字符入队列
{
EnQueue(Q,ch[i]);
i++;
}
i++;
while(ch[i]!='#') //@后#前字符入队列
{
EnQueue(Q,ch[i]);
i++;
}
while(QueueLength(Q)!=0)
{
if(!DeQueue(Q,c)) return ERROR;//取队头元素
if(!DeQueue_rear(Q,e)) return ERROR;//取队尾元素
if(*c!=*e) return 0;
}
if(Q->front==Q->rear) return 1; //队列为空,成功对称
}

int main()
{
SqQueue Q;
//Q=(SqQueue*)malloc(sizeof(*Q));
//if(!Q) exit(1);
int i=0;
char ch[100]={'0'},c;
do{
printf("请输入一个字符(形如a+b@b+a#的序列):\n");
scanf("%c",&c);
getchar();
ch[i]=c;
i++;
}while(c!='#');
if(CheckSymmetry(&Q,ch)) printf("是中心对称序列\n");
else printf("不是中心对称序列\n");
}



这是问题截图,好像没办法判断,不知道代码哪里出错了??
麻烦说详细一点,我的程序好几个都出现了运行一半不动了的问题,不知道是不是共性问题
非常感谢!!!
...全文
632 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
up___lqw 2020-12-24
  • 打赏
  • 举报
回复
引用 1 楼 自信男孩的回复:
#include <stdio.h>
#include <stdlib.h>

#define MAXQSIZE 100
#define ERROR 0
#define OK 1

typedef struct{
char *base;
int front;
int rear;
}SqQueue;

void InitQueue(SqQueue *Q) //建立顺序队列
{
Q->base=(char*)malloc(MAXQSIZE*sizeof(char));
if(!Q->base)
exit(1);
Q->front = Q->rear = 0;
}

int EnQueue(SqQueue *Q,char e)
{
if((Q->rear+1)%MAXQSIZE==Q->front) return ERROR; //队列满条件
Q->base[Q->rear]=e;
Q->rear=(Q->rear+1)%MAXQSIZE;
return OK;
}

int DeQueue(SqQueue *Q,char *e) //从队列头删除一个元素
{
if(Q->front==Q->rear)
return ERROR; //队列空条件
*e=Q->base[Q->front];
Q->front=(Q->front+1)%MAXQSIZE;
return OK;
}

int DeQueue_rear(SqQueue *Q,char *e) //从队列尾删除一个元素
{
if(Q->front == Q->rear)
return ERROR; //队列空
//*e=Q->base[Q->rear];
*e=Q->base[Q->rear-1];
Q->rear=(Q->rear-1)%MAXQSIZE;

return OK;
}

int GetHead(SqQueue Q,char *e)
{
if(Q.front==Q.rear)
return ERROR; //队列空
*e=Q.base[Q.front];
return OK;
}

int QueueLength(SqQueue *Q)
{
return (Q->rear-Q->front+MAXQSIZE)%MAXQSIZE;
}

int CheckSymmetry(SqQueue *Q,char ch[])
{
InitQueue(Q);
int i=0;
//char *e,*c;
char e, c;
while(ch[i]!='@') //@前字符入队列
{
EnQueue(Q,ch[i]);
i++;
}
i++;
while(ch[i]!='#') //@后#前字符入队列
{
EnQueue(Q,ch[i]);
i++;
}
while(QueueLength(Q)!=0)
{
if(!DeQueue(Q, &c))
return ERROR;//取队头元素
if(!DeQueue_rear(Q, &e))
return ERROR;//取队尾元素
printf("%c:%c\n", c, e);
if(c != e)
return 0;
}
if(Q->front==Q->rear)
return 1; //队列为空,成功对称

return 0;
}

int main(void)
{
SqQueue Q;
//Q=(SqQueue*)malloc(sizeof(*Q));
//if(!Q) exit(1);
int i=0;
char ch[100]={'0'}, c;
do{
printf("请输入一个字符(形如a+b@b+a#的序列):\n");
scanf("%c",&c);
getchar();
ch[i]=c;
i++;
}while(c != '#');
if(CheckSymmetry(&Q,ch))
printf("是中心对称序列\n");
else
printf("不是中心对称序列\n");
}

供参考~
非常感谢!!但是有个疑问,在检验匹配的函数里,char *e,*c,为什么不可以呢,传指针进入DeQueue 函数,然后把指针的值赋为要弹出的队列值,这样为什么不可以呢??希望可以解释一下非常感谢!!
自信男孩 2020-12-21
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>

#define MAXQSIZE 100
#define ERROR 0
#define OK 1

typedef struct{
char *base;
int front;
int rear;
}SqQueue;

void InitQueue(SqQueue *Q) //建立顺序队列
{
Q->base=(char*)malloc(MAXQSIZE*sizeof(char));
if(!Q->base)
exit(1);
Q->front = Q->rear = 0;
}

int EnQueue(SqQueue *Q,char e)
{
if((Q->rear+1)%MAXQSIZE==Q->front) return ERROR; //队列满条件
Q->base[Q->rear]=e;
Q->rear=(Q->rear+1)%MAXQSIZE;
return OK;
}

int DeQueue(SqQueue *Q,char *e) //从队列头删除一个元素
{
if(Q->front==Q->rear)
return ERROR; //队列空条件
*e=Q->base[Q->front];
Q->front=(Q->front+1)%MAXQSIZE;
return OK;
}

int DeQueue_rear(SqQueue *Q,char *e) //从队列尾删除一个元素
{
if(Q->front == Q->rear)
return ERROR; //队列空
//*e=Q->base[Q->rear];
*e=Q->base[Q->rear-1];
Q->rear=(Q->rear-1)%MAXQSIZE;

return OK;
}

int GetHead(SqQueue Q,char *e)
{
if(Q.front==Q.rear)
return ERROR; //队列空
*e=Q.base[Q.front];
return OK;
}

int QueueLength(SqQueue *Q)
{
return (Q->rear-Q->front+MAXQSIZE)%MAXQSIZE;
}

int CheckSymmetry(SqQueue *Q,char ch[])
{
InitQueue(Q);
int i=0;
//char *e,*c;
char e, c;
while(ch[i]!='@') //@前字符入队列
{
EnQueue(Q,ch[i]);
i++;
}
i++;
while(ch[i]!='#') //@后#前字符入队列
{
EnQueue(Q,ch[i]);
i++;
}
while(QueueLength(Q)!=0)
{
if(!DeQueue(Q, &c))
return ERROR;//取队头元素
if(!DeQueue_rear(Q, &e))
return ERROR;//取队尾元素
printf("%c:%c\n", c, e);
if(c != e)
return 0;
}
if(Q->front==Q->rear)
return 1; //队列为空,成功对称

return 0;
}

int main(void)
{
SqQueue Q;
//Q=(SqQueue*)malloc(sizeof(*Q));
//if(!Q) exit(1);
int i=0;
char ch[100]={'0'}, c;
do{
printf("请输入一个字符(形如a+b@b+a#的序列):\n");
scanf("%c",&c);
getchar();
ch[i]=c;
i++;
}while(c != '#');
if(CheckSymmetry(&Q,ch))
printf("是中心对称序列\n");
else
printf("不是中心对称序列\n");
}

供参考~

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧