当前位置:   article > 正文

基于C语言的循环队列实现(包含完整代码)_编写程序,实现循环队列的下列操作:( 1 )初始化一个循环队列;( 2 )向循环队列

编写程序,实现循环队列的下列操作:( 1 )初始化一个循环队列;( 2 )向循环队列

循环队列不同于非循环队列和链表,其操作不需要定义next指针,只是单纯的定义一个固定的结构体变量,此结构体中的数组变量已经可以包含全部的已定义的队列长度.(如果采用循环链表来实现队列也可行,但队列会成为可变长的)

首先需要两个头文件#include <stdio.h>和#include <stdlib.h>

1.定义结构体

  1. typedef struct Queue //定义结构体
  2. {
  3. int data[MAXSIZE];//表示结构体的长度
  4. int front;//队列头
  5. int rear;//队列尾
  6. }Queue;

2.初始化队列

  1. Queue *initQueue()
  2. {
  3. Queue *Q = (Queue *)malloc(sizeof(Queue));//申请空间
  4. Q->front = 0;//新的队列初试没有元素,因此队头和队尾都是0
  5. Q->rear = 0;
  6. return Q;
  7. }

3.判满

  1. int isFULL(Queue *Q)
  2. {
  3. if((Q->rear+1)%MAXSIZE==Q->front)//为了和空队进行区别
  4. return 1;
  5. else
  6. return 0;
  7. }

4.入队

  1. int enQueue(Queue *Q,int data)
  2. {
  3. if(isFULL(Q))//先判断队列是否为满
  4. return 0;
  5. else
  6. {
  7. Q->data[Q->rear] = data;//将元素写入data数组中,具体写在那里看队尾
  8. Q->rear = (Q->rear+1)%MAXSIZE;//除以MAXSIZE是防止溢出
  9. return 1;
  10. }
  11. }

5.判空

  1. int isEmpty(Queue *Q)
  2. {
  3. if(Q->front==Q->rear)//与上面的判满做区别
  4. return 0;
  5. else
  6. return 1;
  7. }

6.出队

  1. int deQueue(Queue *Q)
  2. {
  3.     if(isEmpty(Q))//队列不空 
  4.     {
  5.         int data = Q->data[Q->front];//将要出队的元素暂存到data中,最后返回 
  6.         Q->front = (Q->front+1)%MAXSIZE;//出队要看队头,出队后队头向后移,为防止溢出除以MAXSIZE 
  7.         return data;
  8.     }
  9.     else
  10.         return -1;
  11. }

7.遍历输出

  1. void printQueue(Queue *Q)
  2. {
  3. int i;
  4. int length = (Q->rear-Q->front+MAXSIZE)%MAXSIZE;//首先要求队列中元素的个数
  5. int index = Q->front;//定义一个变量表示需要打印的元素的位置(会移动)
  6. for(i=0;i<length;i++)//循环输出
  7. {
  8. printf("%d ",Q->data[index]);
  9. index = (index+1)%MAXSIZE;//除以MAXSIZE防止溢出
  10. }
  11. printf("\n");
  12. }

8.主函数验证

  1. int main()
  2. {
  3. Queue *Q = initQueue();//初始化队列
  4. int i,data;
  5. for(i=0;i<5;i++)
  6. enQueue(Q,i);//验证入队
  7. printQueue(Q);//验证遍历输出
  8. data = deQueue(Q);//验证出队
  9. printQueue(Q);
  10. printf("%d\n",data);
  11. return 0;
  12. }

----------------------------完整代码如下-------------------------------

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 5 //定义循环队列的长度为5 
typedef struct Queue //定义结构体 
{
    int data[MAXSIZE];//表示结构体的长度 
    int front;//队列头 
    int rear;//队列尾 
}Queue;
/*初始化队列*/
Queue *initQueue()
{
    Queue *Q = (Queue *)malloc(sizeof(Queue));//申请空间 
    Q->front = 0;//新的队列初试没有元素,因此队头和队尾都是0 
    Q->rear = 0;
    return Q;
}
/*判满*/
int isFULL(Queue *Q)
{
    if((Q->rear+1)%MAXSIZE==Q->front)//为了和空队进行区别 
        return 1;
    else
        return 0;
}
/*入队*/
int enQueue(Queue *Q,int data)
{
    if(isFULL(Q))//先判断队列是否为满 
        return 0;
    else
    {
        Q->data[Q->rear] = data;//将元素写入data数组中,具体写在那里看队尾 
        Q->rear = (Q->rear+1)%MAXSIZE;//除以MAXSIZE是防止溢出 
        return 1;
    }
}
/*判空*/
int isEmpty(Queue *Q)
{
    if(Q->front==Q->rear)//与上面的判满做区别 
        return 0;
    else
        return 1;
}
/*出队*/
int deQueue(Queue *Q)
{
    if(isEmpty(Q))//队列不空 
    {
        int data = Q->data[Q->front];//将要出队的元素暂存到data中,最后返回 
        Q->front = (Q->front+1)%MAXSIZE;//出队要看队头,出队后队头向后移,为防止溢出除以MAXSIZE 
        return data;
    }
    else
        return -1;
}
/*遍历输出*/
void printQueue(Queue *Q)
{
    int i;
    int length = (Q->rear-Q->front+MAXSIZE)%MAXSIZE;//首先要求队列中元素的个数 
    int index = Q->front;//定义一个变量表示需要打印的元素的位置(会移动) 
    for(i=0;i<length;i++)//循环输出 
    {
        printf("%d ",Q->data[index]);
        index = (index+1)%MAXSIZE;//除以MAXSIZE防止溢出 
    }
    printf("\n");
}
int main()
{
    Queue *Q = initQueue();//初始化队列 
    int i,data;
    for(i=0;i<5;i++)
        enQueue(Q,i);//验证入队 
    printQueue(Q);//验证遍历输出 
    data = deQueue(Q);//验证出队 
    printQueue(Q);
    printf("%d\n",data);
    return 0;
}

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号