首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >队列的实现

队列的实现

作者头像
From Zero
发布2021-02-22 11:17:02
1920
发布2021-02-22 11:17:02
举报
文章被收录于专栏:C语言C语言C语言

队列的实现

队列,顾名思义,是指把数据像排队一样进行管理。先进先出,即只能从队尾加入数据,从队头删除数据。

队列的实现依靠以下结构体:

struct queue {
	int front;
	int tail;
	int* elements;
};

实现关于队列各个操作:

#include 
#include 

#define MAX_SIZE 100

// 初始化一个队列
void initialize(struct queue* q) {
	q->front = 0; //指向第一个元素的位置
	q->tail = 0; //tail指向最后一个元素的下一个位置,若跟front相同则表示队列空
	q->elements = (int *)malloc(sizeof(int)*(MAX_SIZE+1));//多分配一个位置,在首元素之前的那个必定是空
}

// 弹出队首元素,并返回该元素,如果队列为空,返回-1
int pop(struct queue* q) {
	if (q->tail == q->front) return -1;
	int temp = q->elements[q->front];
	q->front++;
	if (q->front == MAX_SIZE + 1) q->front = 0;
	return temp;
}

// 向队列中增加元素,并返回该元素,如果队列已满,返回-1
int push(struct queue* q, int number) {
	if ((q->tail+1)%(MAX_SIZE+1) == q->front%(MAX_SIZE+1)) return -1;//如果最后一个元素后面已经是首元素前一位,就满了
	q->elements[q->tail]  = number;
	q->tail++;
	if (q->tail == MAX_SIZE+1) q->tail = 0;
	return number;
}

// 返回队列长度
int get_size(struct queue* q) {
    if(q->tail == q->front) return 0;
    if(q->tail > q->front) return q->tail - q->front;
	return q->tail + (MAX_SIZE + 1 - q->front);
}

// 返回队首元素,若队列为空,返回-1
int get_front(struct queue* q) {
	if (q->tail == q->front) return -1;
	int temp = q->elements[q->front];
	return temp;
}

// 判断队列是否为空,若是,返回1,否则,返回0
int empty(struct queue* q) {
	if (q->tail == q->front) return 1;
	return 0;
}

// 输出队列,若队列为空,输出“Empty queue”
void list(struct queue* q) {
	if (empty(q)) {
		printf("Empty queue\n");
	}
	else {
		int i=q->front;
        while(i!=q->tail%(MAX_SIZE+1)){
            if((i+1)%(MAX_SIZE+1)==(q->tail))printf("%d\n",q->elements[i]);
            else printf("%d ",q->elements[i]);
            i=(i+1)%(MAX_SIZE+1);
        }
	}
}

int main(){
	int n = 0, op = 0, op_number = 0;
	scanf("%d", &n);
	struct queue q;
	initialize(&q);
	while(n--){
		scanf("%d", &op);
		switch(op){
			case 1:{
				int res = pop(&q);
				if(res == -1){
					printf("Pop failed!\n");
				}
				else{
					printf("Pop %d successfully!\n", res);
				}
				break;
			}
				
			case 2:{
				scanf("%d", &op_number);
				int res = push(&q, op_number);
				if(res == -1){
					printf("Push failed!\n");
				}
				else{
					printf("Push %d successfully!\n", res);
				}
				break;
			}
				
			case 3:{
				printf("Size of queue is %d\n", get_size(&q));
				break;
			}
				
			case 4:{
				int res = get_front(&q);
				if(res == -1){
					printf("Queue is empty!\n");
				}
				else{
					printf("Front element of queue is %d\n", res);
				}
				break;
			}
				
			case 5:{
				int res = empty(&q);
				if(res){
					printf("Queue is empty!\n");
				}
				else{
					printf("Queue is not empty!\n");
				}
				break;
			}	
			default:
				printf("Curr queue is: ");
				list(&q);
		}
	}
	list(&q);
	free(q.elements);
	return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-02-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 队列的实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档