对于线性队列的练习
/*
* Description: 队列的顺序存储方式的练习
* 主要是关于队列的基本的操作
* 包括初始化队列、判空队列、入队、出对
* 读对头元素以及读队中的所有的元素
* 本次练习采用的是 队尾指针指向队尾元素的下一个位置
* Author:qichaoqun
* Date:2019/08/09
* */
#include "stdio.h"
#include "stdlib.h"
#define MAX_SIZE 20
typedef int ElemType;
/**
* 定义队列
* 主要是包括队列的数据段
* 队列的头指针和尾指针
*/
typedef struct {
//定义队列的数据段
// 用于存放进入队列的数值
ElemType data[MAX_SIZE];
//定义队列的头和尾指针
int head,rear;
}SqQueue;
void showMenu();
bool initQueue(SqQueue &sqQueue);
bool isEmptyQueue(SqQueue &sqQueue);
bool enQueue(SqQueue &sqQueue,int value);
bool outQueue(SqQueue &sqQueue,int &outValue);
int getHeadValue(SqQueue &sqQueue);
void getValues(SqQueue &sqQueue);
int main(){
bool isExit = false;
//定义队列
SqQueue sqQueue;
while (!isExit){
showMenu();
int option;
scanf("%d",&option);
switch (option){
case 1:
//初始化队列
if(initQueue(sqQueue)){
printf("初始化成功\n");
}
break;
case 2:
//判断队列是否为空
if(isEmptyQueue(sqQueue)){
printf("队列为空\n");
}else{
printf("队列不为空\n");
}
break;
case 3:
//入队
printf("请输入要入队的元素");
int value;
scanf("%d",&value);
if(enQueue(sqQueue,value)){
printf("入队成功\n");
}else{
printf("入队失败\n");
}
break;
case 4:
//出队
int outValue;
if(outQueue(sqQueue,outValue)){
printf("出队成功,出队的元素为 %d\n",outValue);
}else{
printf("出队失败\n");
}
break;
case 5:{
//获取队头元素
int headValue = getHeadValue(sqQueue);
if(headValue != -65535){
printf("队头的元素为 %d\n",headValue);
}else{
printf("队头元素获取失败\n");
}
break;
}
case 6:
//获取队中的所有的元素
getValues(sqQueue);
break;
case 7:
isExit = true;
break;
default:
printf("输入错误请重新输入\n");
break;
}
}
}
/**
* 获取队中的所有的元素
*/
void getValues(SqQueue &sqQueue){
if(!isEmptyQueue(sqQueue)){
//不为空
int front = sqQueue.head;
printf("队中的元素为 ");
for (int i = front; i < sqQueue.rear; ++i) {
printf(" %d",sqQueue.data[i]);
}
printf("\n");
} else{
printf("队列为空\n");
}
}
/**
* 获取对头的元素
*/
int getHeadValue(SqQueue &sqQueue){
if(!isEmptyQueue(sqQueue)){
//不为空
return sqQueue.data[sqQueue.head];
}
return -65535;
}
/**
* 出队
* 值得注意的是,在进行出对操作时同样的需要对队列进行判断
* 当队列为空的时候则不能进行出对操作
* 当且仅当队列不为空的时候进行出对的操作
*/
bool outQueue(SqQueue &sqQueue,int &outValue){
if(sqQueue.head == sqQueue.rear){
//队列为空则不能进行出对的操作
return false;
}
//队列不为空,则可以进行出对的操作
outValue = sqQueue.head;
sqQueue.head++;
return true;
}
/**
* 入队
* 入队之前要判断队列是否满了
* 如果队列满了则不能入队
* 如果没有满则可以入队
*/
bool enQueue(SqQueue &sqQueue,int value){
if(sqQueue.rear < MAX_SIZE){
//没有满,则进行入队操作
sqQueue.data[sqQueue.rear] = value;
sqQueue.rear++;
return true;
}
return false;
}
/**
* 判断队列是否为空
* 顺序队列 采用小于最大长度的方式可能会产生假溢出
* 这也就是循环队列产生的原因
*/
bool isEmptyQueue(SqQueue &sqQueue){
if(sqQueue.rear == sqQueue.head){
return true;
}
return false;
}
/**
* 初始化队列
*/
bool initQueue(SqQueue &sqQueue){
sqQueue.head = sqQueue.rear = 0;
return true;
}
void showMenu(){
printf(" 对于队列的顺序存储结构的操作\n");
printf("1 初始化队列\n");
printf("2 判断队列是否为空\n");
printf("3 入队\n");
printf("4 出队\n");
printf("5 获取对头元素\n");
printf("6 获取队列中的所有的元素\n");
printf("请输入你的选择 ");
}