沐い 2021-03-27 23:03 采纳率: 50%
浏览 87
已采纳

后两个样例哪里错了?

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

函数接口定义:

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];
		}
   }
}

 

  • 写回答

1条回答 默认 最新

  • 小亮点科技 2021-03-27 23:26
    关注

    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,是不是贴错了。

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

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

    希望对你有帮助。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用