C语言-循环队列的实现

循环队列

1.实验目的

掌握队列的特点(先进先出)及基本操作,如入队、出队等,队列顺序存储结构和循环队列的实现。

2.实验内容

创建一个顺序队列,实现数据的入队和出队运算,进而验证队列的先进先出的特性。步骤如下:

  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.总结

  1. 队列是“先进后出”。
  2. 队列在队尾进栈,在队头出栈。
  3. 队满的标志是(Q.rear+1)%MAXSIZE == Q.front。
  4. 队列和栈都是有限制的顺序表。
  5. 注意取值与取址的适用情况。
原文地址:https://www.cnblogs.com/slz99/p/12527747.html