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.运行结果
入队与出队都符合队列的先进先出的特点