基于C语言实现顺序队列

栈和队列的区别在于,栈是先进后出,而队列是先进先出
下面为入队列的过程

下面为出队列的操作

下面是基于顺序表来实现队列的一些操作
对于队列操作,为了操作方便,需要设立三个变量,分别为head,tail和size,分别表示,链表的头部、尾部和 链表的长度


  5 typedef struct SeqQueue
  6 {
  7     SeqQueueType data[SeqQueueMaxSize];
  8     size_t head;
  9     size_t tail;
 10     size_t size;
 11 }SeqQueue;

队列初始化
队列初始化是将之前在结构体中设立的三个变量都置为0,详细见程序
  5 //队列初始化
  6 void SeqQueueInit(SeqQueue* q)
  7 {
  8     if(q == NULL)
  9     {
 10         //非法操作
 11         return ;
 12     }
 13     q->size = 0;
 14     q->head = 0;
 15     q->tail = 0;
 16     return ;
 17 }
销毁队列
在这里碰巧和队列初始化相同

 20 void SeqQueueDestroy(SeqQueue* q)
 21 {
 22 
 23     if(q == NULL)
 24     {
 25         //非法操作
 26         return ;
 27     }
 28     q->size = 0;
 29     q->head = 0;
 30     q->tail = 0;
 31     return ;
 32 }

入队列
入队列其实就相当于在链表中插入一个节点,有两种方法,一种为头插法,一种为尾插法,在这里采用的是头插法,详细见程序
 34 //入队
 35 void SeqQueuePush(SeqQueue* q,SeqQueueType value)
 36 {
 37     if(q == NULL)
 38     {
 39         //非法操作
 40         return;
 41     }
 42     if(q->size>=SeqQueueMaxSize)
 43     {
 44         //队列已满
 45         return;
 46     }
 47     q->data[q->tail++]=value;
 48     if(q->tail>=SeqQueueMaxSize)
 49     {
 50         q->tail=0;
 51     }                                                                                                       
 52     ++q->size;
 53 }
 54 

出队列
出队列就相当于顺序表的头删或者尾删的方法,在这里选择的是顺序表的头删法,详细见程序

 55 //出队                                                                                                    
 56 void SeqQueuePop(SeqQueue* q)
 57 {
 58     if(q == NULL)
 59     {
 60         //非法操作
 61         return;
 62     }
 63     if(q->size == 0)
 64     {
 65         //队列为空
 66         return ;
 67     }
 68     ++q->head;
 69     --q->size;
 70     if(q->head == SeqQueueMaxSize)
 71     {
 72         q->head=0;
 73     }
 74 }

取队首元素
 75 //取队首元素
 76 int SeqQueueFront(SeqQueue* q,SeqQueueType* value)
 77 {
 78     if(q == NULL || value == NULL)
 79     {
 80         //非法操作
 81         return 0;
 82     }
 83     if(q->size == 0)
 84     {
 85         //队列为空
 86         return 0;
 87     }
 88     *value=q->data[q->head];
 89     return 1;
 90 }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是基于C语言的循环顺序队列实现,包括入队、出队和获取队列长度等操作: ``` #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 typedef struct { int data[MAXSIZE]; int front; // 队头指针 int rear; // 队尾指针 } SqQueue; // 初始化队列 void InitQueue(SqQueue *Q) { Q->front = Q->rear = 0; } // 判断队列是否为空 int QueueEmpty(SqQueue Q) { if (Q.front == Q.rear) { return 1; // 队列为空 } else { return 0; // 队列不为空 } } // 判断队列是否已满 int QueueFull(SqQueue Q) { if ((Q.rear + 1) % MAXSIZE == Q.front) { return 1; // 队列已满 } else { return 0; // 队列未满 } } // 入队操作 int EnQueue(SqQueue *Q, int x) { if (QueueFull(*Q)) { return 0; // 队列已满,入队失败 } else { Q->data[Q->rear] = x; // 将新元素存入队尾 Q->rear = (Q->rear + 1) % MAXSIZE; // 队尾指针后移一位,如果到达数组末尾,则回到数组开头 return 1; // 入队成功 } } // 出队操作 int DeQueue(SqQueue *Q, int *x) { if (QueueEmpty(*Q)) { return 0; // 队列为空,出队失败 } else { *x = Q->data[Q->front]; // 取出队头元素 Q->front = (Q->front + 1) % MAXSIZE; // 队头指针后移一位,如果到达数组末尾,则回到数组开头 return 1; // 出队成功 } } // 获取队列长度 int QueueLength(SqQueue Q) { return (Q.rear - Q.front + MAXSIZE) % MAXSIZE; } int main() { SqQueue Q; int x, len; InitQueue(&Q); // 入队操作 EnQueue(&Q, 1); EnQueue(&Q, 2); EnQueue(&Q, 3); EnQueue(&Q, 4); // 出队操作 DeQueue(&Q, &x); printf("%d ", x); DeQueue(&Q, &x); printf("%d ", x); // 获取队列长度 len = QueueLength(Q); printf("%d", len); return 0; } ``` 以上代码实现了循环顺序队列的入队、出队和获取队列长度等操作。其中,`InitQueue`用于初始化队列,`QueueEmpty`用于判断队列是否为空,`QueueFull`用于判断队列是否已满,`EnQueue`用于入队操作,`DeQueue`用于出队操作,`QueueLength`用于获取队列长度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值