数据结构之队列(C语言)

本文详细介绍了队列的基本概念,特别关注了循环队列的实现,包括置空队列、判断队列是否为空、入队、取队头元素和出队等操作,以及相应的C语言代码示例。
摘要由CSDN通过智能技术生成

1.队列的概念:只能选择一个端点进行插入操作(队尾),在另一端删除的线性表 (队头) 

2.队列可实现的操作:

①置空队列 

②判断队列是否为空

③入队

④取队头元素

⑤出队

3.存储结构:循环顺序队列

具体代码如下:

#include<stdio.h>
#include<stdlib.h>
#define Max 3
typedef int eletype;
typedef struct Node{
eletype data[Max];
int front,rear ;//front为队头元素前面位置的下标,rear为队尾元素的实际下标 
} seQueue;
//队空的条件:rear==front

首先定义一个结构体变量seQueue,值得注意的是front为队头元素前面位置的下标,rear为队尾元素的实际下标 

①置空队列 

seQueue *setNull() {
 	 seQueue *s=(seQueue *)malloc(sizeof(seQueue ));
 	 s->rear=s->front=Max-1;
 	 return s;
 }

这里因为是循环队列,所以判断队空的条件可以是s->rear=s->front=Max-1也可以是s->rear=s->front=0

但是这两种条件均导致,队列中能容纳的元素为Max-1(只是在本代码中是这样的)

②判断队列是否为空

int Empty(seQueue *s){
 	return(s->rear==s->front?1:0);
 }

若为空返回1,否则返回0

③入队

int enQueue(seQueue *s,eletype x){
	if((s->rear+1)%Max==s->front){
		printf("队满\n");
		return 0;
	}
	else
	    s->rear=(s->rear+1)%Max;
	    s->data[s->rear]=x;
	    return 1;
}

  循环队列中,入队时,会出现假满(上溢)的情况 ,
入队时,将rear在循环意义下加1,如果rear追上了front,则队满,从而当rear==front时,
无法区分是队空还是队满 。为了保证rear==front是队空的唯一条件,则入队时,不允许rear==front,
  即rear即将追上front,认为队满。
这里我们用if((rear+1)%Max==front) 表示队满
用if(rear==front) 表示队空 

④取队头元素

int getQueue(seQueue*s,eletype*x) {
	if(s->rear==s->front) {
	printf("队空\n") ;
	return 0;
	}
	else
	 *x=s->data[(s->front+1)%Max] ;
	 return 1;
}

取队列s的队头元素值 
如果取不成功,则返回为0
如果成功,则将队头元素赋值给形参变量x的指向,并返回1

⑤出队

int  deQueue(seQueue*s,eletype*x) {
	if(s->rear==s->front ){
	 printf("队空\n") ;
	 return 0;
	}
	else
    s->front=(s->front+1)%Max;
	*x=s->data[s->front];
	return 1;
}

如果出队不成功,返回值为0
如果队空,则输出“队空”,并且返回0
将front在循环意义下加1,将原来的队头元素值赋值给指针变量x的指向 ,并返回1 

主函数调用

int main(){
	int y;
	seQueue *s=setNull();
	printf("%d\n",Empty(s));//1
	printf("%d\n",getQueue(s,&y));//队空,0 
	printf("%d\n",deQueue(s,&y));//队空,0 
	printf("%d\n",enQueue(s,100));// 1
	printf("%d\n",enQueue(s,200));// 1
	printf("%d\n",enQueue(s,300));// 队满,下一行0 
	printf("%d\n",getQueue(s,&y));//取值成功,1
	printf("y=%d\n",y);//y=100
	printf("%d\n",deQueue(s,&y));//1
	printf("y=%d\n",y);//y=100
	printf("%d\n",deQueue(s,&y));//1,此时队空
	printf("y=%d\n",y);//y=200
	printf("%d\n",Empty(s));//1
	printf("%d\n",getQueue(s,&y));//队空;
	return 0; 
}

运行结果:


 

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值