循环队列
1.实验目的
掌握队列的特点(先进先出)及基本操作,如入队、出队等,队列顺序存储结构和循环队列的实现。
2.实验内容
创建一个顺序队列,实现数据的入队和出队运算,进而验证队列的先进先出的特性。步骤如下:
- 创建入队和出队函数;
- 在主函数中输入数据,以“ ”做结束标志,调用入队和出队函数。
3.实验工具
Visual C++
4.实验代码
如下:
//Authors:xiaobei
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 6
#define OK 1
#define ERROR 0
typedef struct
{
char *base;
int front;
int rear;
}SqQueue;
int InitQueue(SqQueue &Q);
void EnQueue(SqQueue &Q,char e);
void DeQueue(SqQueue &Q,char &e);
int main()
{
int user,i,n;
char ch,group[MAXSIZE+1];
SqQueue Q;
if(InitQueue(Q))
printf("初始化成功……
");
else
printf("初始化失败……
");
while(1)
{
if(group[0])
{
for(i=0;i<MAXSIZE;i++)
group[i] = ' ';
}
printf("------------
");
printf("1.入队
2.出队
0.退出");
printf("
------------");
printf("
(请输入你的选择)
>>>");
scanf("%d",&user);
switch(user)
{
case 1:{
printf("rear = %d;front = %d
",Q.rear,Q.front);
printf("(请输入入队元素)
>>>");
getchar(); //吸收"
"
gets(group);
for(i=0;i < MAXSIZE;i++)
{
if(group[i]!=' ')
EnQueue(Q,group[i]);
else
break;
}
}break;
case 2:{
printf("rear = %d
front = %d
",Q.rear,Q.front);
printf("(请输入出队个数)
>>>");
scanf("%d",&n);
for(i=0;i<n;i++)
DeQueue(Q,ch);
}break;
case 0:exit(0);
}
}
return 0;
}
//初始化
int InitQueue(SqQueue &Q)
{
Q.base = (char*)malloc(MAXSIZE*sizeof(char));
if(!Q.base)
return ERROR;
else
{
Q.front = 0;
Q.rear = Q.front;
return OK;
}
}
//进队
void EnQueue(SqQueue &Q,char e)
{
if((Q.rear+1)%MAXSIZE == Q.front) //此时的队满,并非真的队满,rear与front相差一个单位
printf("
队列已满!
");
else
{
Q.base[Q.rear] = e;
Q.rear = (Q.rear+1)%MAXSIZE;
printf("rear = %d;front = %d
",Q.rear,Q.front);
printf("
%c入队成功!
",e);
}
}
//出队
void DeQueue(SqQueue &Q,char &e)
{
if(Q.front == Q.rear)
printf("
队列已空!
");
else
{
e = Q.base[Q.front];
Q.front = (Q.front+1)%MAXSIZE;
printf("rear = %d;front = %d
",Q.rear,Q.front);
printf("
%c出队成功!
",e);
}
}
5.总结
- 队列是“先进后出”。
- 队列在队尾进栈,在队头出栈。
- 队满的标志是(Q.rear+1)%MAXSIZE == Q.front。
- 队列和栈都是有限制的顺序表。
- 注意取值与取址的适用情况。