6-1 循环队列入队出队


               6-1 循环队列入队出队 

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

函数接口定义:
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) {
    
    if((squeue->r+1)%squeue->Max!=squeue->f){
        
        squeue->r=(squeue->r+1)%squeue->Max;
        
        squeue->elem[squeue->r]=x;
  
    }
    
    else printf("It is FULL Queue!");

}

void DeQueue_seq(SeqQueue squeue){
    
    if(squeue->r!=squeue->f){
        
        squeue->f=(squeue->f+1)%squeue->Max;
    
    }

}

DataType FrontQueue_seq(SeqQueue squeue){
   
    if(squeue->r==squeue->f)printf("It is empty queue!");
    
    return squeue->elem[(squeue->f+1)%squeue->Max];

}
  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 循环队列是一种特殊的队列,它可以避免队列满时浪费存储空间的问题。循环队列实现需要使用一个数组和两个指针,一个指向队,一个指向队尾。 入队操作时,先判断队列是否已满,如果未满,则将元素插入队尾,并将队尾指针向后移动一位。如果队列已满,则无法插入元素。 出队操作时,先判断队列是否为空,如果非空,则将队元素取出,并将队指针向后移动一位。如果队列为空,则无法取出元素。 循环队列入队出队操作的时间复杂度均为 O(1),因此循环队列是一种高效的队列实现方式。 ### 回答2: 循环队列是一种特殊的队列,它的队尾指针可以绕回队,形成一个循环。在循环队列中,入队出队操作需要处理队尾指针的循环问题。 对于循环队列入队操作,首先需要判断队列是否已满。判断队满的条件是队尾指针的下一个位置等于队指针,即 `(rear + 1) % queueSize == front`。如果队满,则无法入队,否则可以将元素插入队尾,并更新队尾指针为 `(rear + 1) % queueSize`。 对于循环队列出队操作,首先需要判断队列是否为空。判断队空的条件是队指针等于队尾指针,即 `front == rear`。如果队空,则无法出队,否则可以将队元素删除,并更新队指针为 `(front + 1) % queueSize`。 循环队列入队出队操作都涉及到对队和队尾指针进行取模运算,这是为了实现循环的目的。取模运算可以保证队尾指针在递增过程中不会越界,同时可以保持队列的连续性。 总结:循环队列入队出队操作需要注意队满和队空的条件,并且对队和队尾指针进行取模运算来实现循环。入队时判断队满,出队时判断队空。入队时更新队尾指针,出队时更新队指针。循环队列入队出队操作时间复杂度都为O(1)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值