数据结构-顺序队列(C语言)

1.函数的声明与自定义

queue.h

#pragma once
#include<stdio.h>
#include<stdlib.h>

#define MaxSize 100
#define EXIT 0
#define PUSH 1
#define OUTPUT 2
#define PRINT 3

typedef char ElemType;

typedef struct sqqueue {
	ElemType data[MaxSize];
	int front, rear;
}SqQueue;

#ifndef __QUEUE_H__
#define __QUEUE_H__

void menu();

void InitQueue(SqQueue*& q);

void Destroy(SqQueue*& q);

bool QueueEmpty(SqQueue* q);

bool enQueue(SqQueue*& q,ElemType e);

bool deQueue(SqQueue*& q,ElemType &e);

void printQueue(SqQueue* q);
#endif // !__QUEUE_H__

2.队列的各操作函数

顺序队.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "queue.h"

void menu() {
	printf("*************************************************\n");
	printf("*********1.push                 2.output*********\n");
	printf("*********3.print                0.exit***********\n");
	printf("*************************************************\n");
}

//初始化队列
void InitQueue(SqQueue*& q) {
	q = (SqQueue*)malloc(sizeof(sqqueue));			//开辟队列空间
	q->front = -1;									//队头与队尾都设置从-1开始
	q->rear = -1;
	//环形队列
	//q->front = q->rear = 0;
}

//销毁队列
void Destroy(SqQueue*& q) {
	free(q);										//释放队列空间
	q = NULL;										//使指针为空,避免成为野指针
}

//判断队列是否为空
bool QueueEmpty(SqQueue* q) {
	return(q->front == q->rear);					//只有队尾和队头相等才为空
}

//入队操作
bool enQueue(SqQueue*& q,ElemType e) {
	if (q->rear == MaxSize - 1) {					//判断是否满,防止上溢,因为是从0开始,所以MaxSize-1为满
		return false;
	}
	q->rear++;										//队尾位置++
	q->data[q->rear] = e;							//该位置的元素等于用户输入的值
	return true;

	//环形队列
	//if ((q->rear+1)%MaxSize == q->front) {
	//	return false;
	//}
	//q->rear = (q->rear + 1) % MaxSize;
	//q->data[q->rear] = e;
	//return true;
}

//出栈操作
bool deQueue(SqQueue*& q,ElemType &e) {
	if (q->front == q->rear) {						//判断是否为空,防止下溢
		return false;
	}
	q->front++;										//出队是先进先出,所以是front++
	e = q->data[q->front];							//一样可以告知用户出栈了什么元素
	return true;

	//环形队列
	//if (q->front == q->rear) {
	//	return false;
	//}
	//q->front=(q->front+1)%MaxSize;
	//e = q->data[q->front];
	//return true;

}

//打印队列中元素
void printQueue(SqQueue* q) {
	if (QueueEmpty(q) ){							//判断是否为空,是否有元素可打印
		printf("is empty\n");
		return;
	}
	int i = q->front+1;
	printf("已插入的元素:");
	while (i != q->rear){
		printf("%c ", q->data[i]);
		i++;
	}
	printf("%c \n", q->data[i]);


	/*环形队列
	int i = q->front;
	while (i = q->rear) {
		printf("%c ", q->data[i]);
		i = (i + 1) % MaxSize;
	}*/
}

3.运行

TEST.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "queue.h"

int main() {
	SqQueue* q;
	ElemType e;
	
	int intput = 0;

	InitQueue(q);
	do {
		menu();
		printf("请选择模式:");
		scanf("%d", &intput);
		switch (intput) {
		case PUSH:
			printf("输入要插入的值:");
			getchar();
			scanf("%c", &e);
			if (enQueue(q,e)) {
				printf("插入成功\n");
			}
			else {
				printf("插入失败\n");
			}
			break;
		case OUTPUT:
			if (deQueue(q, e)) {
				printf("出队成功\n");
			}
			else {
				printf("出队失败\n");
			}
			break;
		case PRINT:
			printQueue(q);
			break;
		case EXIT:
			Destroy(q);
			break;
		default:
			printf("is wrong,please reintput\n");
			break;
		}
	} while (intput);


	return 0;
}

4.运行结果

入队与出队都符合队列的先进先出的特点

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值