用队列实现形如a+b@b+a#的中心对称字符的检验
我用网上提供的一种思想,用循环队列实现了这个操作,具体代码如下。
/*函数名match,严格来说它并不是Status型*/
Status match(char *a){
SqQueue q; //定义循环队列q
char b,c;
char*p=a;
InitQueue(q); //初始化队列q
while(*p!='@'){ //不断进行入队操作,遇到@停止
EnQueue(q,*p);
p++;
}
p++;
while(*p!='#'){
EnQueue(q,*p);
p++;
}
while (QueueLength(q) != 0) {
if (!DeQueuefront(q, b))return OVERFLOW;
if (!DeQueuerear(q, c))return OVERFLOW;
//如果队长不为0,分别取队头元素与队尾元素进行比较
if (b != c) {
return FALSE;
} //若不等返回FALSE,相等则返回OK
} if (q.rear == q.front) {
return OK;
}
}
下面把循环队列的基本操作中本程序用到的函数再贴一遍
Status InitQueue (SqQueue &Q){ //初始化循环队列
Q.base=(QElemType * )malloc(MAXQSIZE*sizeof(QElemType));
if(!Q.base)exit(OVERFLOW);
Q.front=Q.rear=0;
return OK;
}
int QueueLength(SqQueue Q){ //返回队长函数
return(Q.rear-Q.front+MAXQSIZE) % MAXQSIZE;
}
Status EnQueue(SqQueue &Q,QElemType e){ //入队函数
if((Q.rear+1)%MAXQSIZE == Q.front)return ERROR;
Q.base[Q.rear]=e;
Q.rear =(Q.rear+1)%MAXQSIZE;
return OK;
}
Status DeQueuefront(SqQueue &Q,QElemType &e){ //返回队头值函数
if(Q.front ==Q.rear) return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
return OK;
}
Status DeQueuerear(SqQueue &Q,QElemType &e){ //返回队尾值函数
if(Q.front ==Q.rear) return ERROR;
Q.rear = (Q.rear - 1) % MAXQSIZE;
e=Q.base[Q.rear];
return OK;
}