#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define MAXSIZE 100 /* 环状队列空间的存储量 */
typedef int DataType; /* 环状队列元素类型 */
typedef struct {
DataType *data; /* 环状队列元素存储空间基址 */
int front, rear; /* 环状队列头、尾 */
} SeqQueue; /* 环状队列类型 */
void wait()
{
printf("\n请按任意键...\n");
getch();
}
int go_on()
{
int flag = 1;
char choice;
while(1) {
printf("\n继续吗?[Y/N]");
choice = getche();
if (choice == 'Y' || choice == 'y')
break;
else if (choice == 'N' || choice == 'n') {
flag = 0;
break;
}
}
return (flag);
}
/* 初始化,构造一个空环状队列 */
void Init_SeqQueue(SeqQueue *Q, int n)
{
Q->data = (DataType *)malloc(n*sizeof(DataType));
if(Q->data == NULL) {
printf("\n内存分配失败.\n");
exit(-1);
}
Q->front = Q->rear = 0;
}
/* 判断环状队列是否为空 */
int Empty_SeqQueue(SeqQueue *Q)
{
if(Q->front == Q->rear)
return (1);
else
return (0);
}
/* 判断环状队列是否为满 */
int Full_SeqQueue(SeqQueue *Q)
{
if((Q->rear+1) % MAXSIZE == Q->front)
return (1);
else
return (0);
}
/* 求环状队列队长 */
int Length_SeqQueue(SeqQueue *Q)
{
int k;
k = (Q->rear - Q->front + MAXSIZE) % MAXSIZE;
return (k);
}
void Length(SeqQueue *Q)
{
int k;
k = Length_SeqQueue(Q);
printf("\n队长:%d\n", k);
}
/* 入队,插入元素e为新的队头元素 */
int EnQueue_SeqQueue(SeqQueue *Q, DataType e)
{
if(Full_SeqQueue(Q) == 1) { /* 队满,不能入队 */
printf("队满,不能入队.\n");
return (0);
}
else {
Q->data[Q->rear] = e; /* 元素e入队 */
Q->rear = (Q->rear + 1) % MAXSIZE;
return (1);
}
}
void EnQueue(SeqQueue *Q)
{
DataType x;
int flag = 1, enqueue_flag;
while(flag) {
printf("\n请输入要入队元素:");
scanf("%d", &x);
enqueue_flag = EnQueue_SeqQueue(Q, x);
if (enqueue_flag == 1)
printf("\n入队成功.\n");
else
printf("\n入队失败.\n");
flag = go_on();
}
}
/* 出队,删除队头元素,并由*e返回其值 */
int DeQueue_SeqQueue(SeqQueue *Q, DataType *e)
{
if(Empty_SeqQueue(Q)) { /* 队空,不能出队 */
printf("\n队空,不能出队.\n");
return (0);
}
else {
*e = Q->data[Q->front];
Q->front = (Q->front + 1) % MAXSIZE;
return (1);
}
}
void DeQueue(SeqQueue *Q)
{
DataType x;
int flag = 1, dequeue_flag;
while (flag) {
dequeue_flag = DeQueue_SeqQueue(Q, &x);
if(dequeue_flag == 1)
printf("\n出队成功,出队元素为:%d\n", x);
else
printf("\n出队失败.\n");
flag = go_on();
}
}
/* 取队头元素,由*e返回其值 */
int GetFront_SeqQueue(SeqQueue *Q, DataType *e)
{
if(Empty_SeqQueue(Q)) { /* 队空,不能取队头元素 */
printf("\n队空,不能取队头元素.\n");
return (0);
}
else {
*e = Q->data[Q->front];
return (1);
}
}
/* 输出队头元素 */
void Display_Front(SeqQueue *Q)
{
DataType e;
if(Empty_SeqQueue(Q) == 1)
printf("\n队空,没有元素.\n");
else {
GetFront_SeqQueue(Q, &e);
printf("\n队头元素:\n");
printf("%4d\n", e);
}
}
/* 输出队全部元素 */
void Display_SeqQueue(SeqQueue *Q)
{
int k, len;
if(Empty_SeqQueue(Q)==1)
printf("\n队空,没有元素.\n");
else {
printf("\n队全部元素\n");
printf("\n队头<--------------------->队尾\n");
len = Length_SeqQueue(Q);
for(k=0; k<len; k++)
printf("%4d", Q->data[(Q->front+k)%MAXSIZE]);
}
}
int main(void)
{
SeqQueue Q;
char choice;
int flag = 1;
Init_SeqQueue(&Q, MAXSIZE);
do {
printf("\n");
printf("-----环状顺序队列(动态数组实现)-----\n");
printf(" 1........入队元素\n");
printf(" 2........出队元素\n");
printf(" 3........输出队长\n");
printf(" 4........输出队头元素\n");
printf(" 5........输出全部元素\n");
printf(" 0........退出\n");
printf("请选择[1/2/3/4/5/0]: ");
choice = getche();
switch(choice) {
case '1':
EnQueue(&Q);
break;
case '2':
DeQueue(&Q);
break;
case '3':
Length(&Q);
break;
case '4':
Display_Front(&Q);
break;
case '5':
Display_SeqQueue(&Q);
break;
case '0':
flag = 0;
break;
}
wait();
} while(flag == 1);
return (0);
}