后两个样例哪里错了?

本题要求实现队列的顺序存储表示,包括入队、出队和取队头操作

函数接口定义:

void EnQueue_seq(SeqQueue squeue, DataType x)  ;
void DeQueue_seq(SeqQueue squeue)  ;
DataType FrontQueue_seq(SeqQueue squeue) ;

其中,squeue 是操作的队列,x是入队的元素

裁判测试程序样例:


#include <stdio.h>
#include <stdlib.h>
typedef char DataType;
struct Queue
{
    int Max;  
    int f;   
    int r;  
    DataType *elem; 
};
typedef struct Queue *SeqQueue;

SeqQueue SetNullQueue_seq(int m) 
{
    SeqQueue squeue;
    squeue = (SeqQueue)malloc(sizeof(struct Queue));
    if (squeue == NULL)
    {
        printf("Alloc failure\n");
        return NULL;
    }
    squeue->elem = (char*)malloc(sizeof(DataType)*m);
    if (squeue->elem != NULL)
    {
        squeue->Max = m;
        squeue->f = 0;
        squeue->r = 0;
        return squeue;
    }
}

int IsNullQueue_seq(SeqQueue squeue) 
{
    return (squeue->f == squeue->r);
}
void EnQueue_seq(SeqQueue squeue, DataType x)  
{
    @@
}
void DeQueue_seq(SeqQueue squeue)  
{
    @@
}
DataType FrontQueue_seq(SeqQueue squeue) 
{
    @@
}

int main()
{
    char ch;
    SeqQueue queueA = SetNullQueue_seq(5);
    ch = getchar();
    while (ch != '#')
    {
        EnQueue_seq(queueA, ch);
        ch = getchar();
    }
    DeQueue_seq(queueA);
    printf("%c" ,FrontQueue_seq(queueA));
    return 0;
}

输入样例:

ABCD#

输出样例:

B

输入样例:

A#

输出样例:

It is empty queue!

输入样例:

ABCDEF#

输出样例:

It is FULL Queue!It is FULL Queue!B

 

这是我写的函数 

void EnQueue_seq(SeqQueue squeue, DataType x)  
{
	squeue->elem[squeue->r]=x;
	squeue->r=(squeue->r+1)%squeue->Max;
    
    return;
}
void DeQueue_seq(SeqQueue squeue)  
{
	squeue->f=(squeue->f+1)%squeue->Max;
}
DataType FrontQueue_seq(SeqQueue squeue) 
{
	if(IsNullQueue_seq(squeue))
	{
		printf("It is empty queue!");
	}
	else
	{
	    if((squeue->f+1)%squeue->Max==squeue->f)
	    {
		    printf("It is FULL Queue!It is FULL Queue!%c",squeue->elem[squeue->f]);
	    }
	    else
	    {
	    	return squeue->elem[squeue->f];
		}
   }
}

 

 

if((squeue->f+1)%squeue->Max==squeue->f)

 

{

 

printf("It is FULL Queue!It is FULL Queue!%c",squeue->elem[squeue->f]);

 

}

你帖的代码和你运行的代码是一致的吗?感觉(squeue->f+1)%squeue->Max==squeue->f这个条件永远成立不了吧?怎么会打印出It is FULL Queue!It is FULL Queue!B,是不是贴错了。

你目前的思路是每插入一个元素就将尾指针后移。也就是说尾指针永远指向队尾的下一个单元。当队列满时尾指针就指向了队列头的位置。这个时候头尾指针是相等的,这种做法队列空和队列尾的头尾指针都是相等的。需要有个状态来记录队列是空还是满,才能判断是否满。或者需要空一个单元即当头尾重和时将头指针下移。永远留一个空单元。这两种办法各有优劣。否则无法判断是否满。

另外不管哪种办法,都要在队列满的时候,再插入数据就要移动头指针。或者提示满了不让再插入。但你的入函数中没有移动头指针这里也是有问题的。

希望对你有帮助。