循环队列
1.实验目的
掌握队列的特点(先进先出)及基本操作,如入队、出队等,队列顺序存储结构和循环队列的实现。
2.实验内容
创建一个顺序队列,实现数据的入队和出队运算,进而验证队列的先进先出的特性。步骤如下:
- 创建入队和出队函数;
- 在主函数中输入数据,以“\0”做结束标志,调用入队和出队函数。
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("初始化成功……\n");
else
printf("初始化失败……\n");
while(1)
{
if(group[0])
{
for(i=0;i<MAXSIZE;i++)
group[i] = '\0';
}
printf("------------\n");
printf("1.入队\n2.出队\n0.退出");
printf("\n------------");
printf("\n(请输入你的选择)\n>>>");
scanf("%d",&user);
switch(user)
{
case 1:{
printf("rear = %d;front = %d\n",Q.rear,Q.front);
printf("(请输入入队元素)\n>>>");
getchar(); //吸收"\n"
gets(group);
for(i=0;i < MAXSIZE;i++)
{
if(group[i]!='\0')
EnQueue(Q,group[i]);
else
break;
}
}break;
case 2:{
printf("rear = %d\nfront = %d\n",Q.rear,Q.front);
printf("(请输入出队个数)\n>>>");
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("\n队列已满!\n");
else
{
Q.base[Q.rear] = e;
Q.rear = (Q.rear+1)%MAXSIZE;
printf("rear = %d;front = %d\n",Q.rear,Q.front);
printf("\n%c入队成功!\n",e);
}
}
//出队
void DeQueue(SqQueue &Q,char &e)
{
if(Q.front == Q.rear)
printf("\n队列已空!\n");
else
{
e = Q.base[Q.front];
Q.front = (Q.front+1)%MAXSIZE;
printf("rear = %d;front = %d\n",Q.rear,Q.front);
printf("\n%c出队成功!\n",e);
}
}
5.总结
- 队列是“先进后出”。
- 队列在队尾进栈,在队头出栈。
- 队满的标志是(Q.rear+1)%MAXSIZE == Q.front。
- 队列和栈都是有限制的顺序表。
- 注意取值与取址的适用情况。