数据与结构-队列

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20
//循环队列 
typedef int datatype;
typedef struct
{
    datatype data[MAXSIZE];//队列的数据存储区 
    int front,rear;//队列的头尾指针 
    int size;//记录队列的长度
}CSeQueue;
//初始化队列
CSeQueue InitSeQueue(CSeQueue *q)
{
    q->front=q->rear=0; 
    q->size=0;
 } 
 CSeQueue InitSeQueue1(CSeQueue *q)
{
    q->front=q->rear=0; 
    q->size=0;
    printf("队列已被清空!\n");
 } 
 //入队rear移动 ++
 int InSeQueue(CSeQueue *q,datatype x)
 {
     if((q->rear+1)%MAXSIZE==q->front)
     {
         printf("队满!");
         return -1;//队满不能入队 
     }
     else{
         q->rear=(q->rear+1)%MAXSIZE;
         q->data[q->rear]=x;
         q->size++;
         return 1;//入队成功 
     }
  } 
  //出队front移动-- 
int outSeQueue(CSeQueue *q,datatype *x)//*x是带回值的指针 
  {
      if(q->front==q->rear)
      {
          printf("队空!");
          return -1;//队空不能出栈 
      }
      else
      {
          q->front=(q->front+1)%MAXSIZE;
          *x=q->data[q->front];//读取最开始的入队元素
          q->size++;
          return 1; 
      }
   } 
   //判队空
   int EmptySeQueue(CSeQueue *q)
   {
       if(q->front==q->rear)
       return 1;
       else
       return -1;
    } 
    //取队列首个元素
     datatype Top_SeqStack(CSeQueue *q) 
       {
      if(q->front==q->rear)
      {
          printf("队空!");
          return -1;//队空不能出栈 
      }
      else
      {
          q->front=(q->front+1)%MAXSIZE;
          return (q->data[q->front]); 
      }
   } 
   //求队列长度 
   int long_SeqStack(CSeQueue *q)
   {
       
       return (q->rear-q->front+MAXSIZE)%MAXSIZE;
   }
  //遍历队列 
    void output(CSeQueue *q)
    {
        int i;
    i=(q->front+1);
    if(q->front!=q->rear){
    while(i!=(q->rear+1))
    {
        printf("%3d",q->data[i]);
        i++;
        }}
        else 
        printf("队列空!无法遍历!\n");    
    }
    //5.队的遍历:
void print(CSeQueue *q)
{
    int i=0;
    i=q->front;
    while(q->rear != q->front)  //直到队尾追上队头,也就是队为空,退出遍历 //每次输出的实际上是队的数据 
    {
         q->front = (q->front + 1) % MAXSIZE;
         printf("%3d", q->data[q->front]);
    } 
     q->front=i;
}
    int main()
    {
        CSeQueue q1;
        InitSeQueue(&q1);
        datatype num=1,num1,num2,num3;
        int num4,num6;
    printf("0表示退出队列\n");
      printf("1表示入队列\n");
      printf("2表示出队列\n");
      printf("3表示取队列元素\n");
      printf("4表示判断队列是否为空\n");
      printf("5表示销毁栈\n");
      printf("6表示求队列的长度\n");
      printf("7遍历队列\n");
      printf("8表示队列置空\n");
      printf("请输入你的指令!\n");
      while(num!=0)
      {
          printf("\n请输入指令:");
          scanf("%d",&num);
          switch(num)
          {
              case 0:num=0;
              break;
              case 1:printf("请输入入队的元素:\n");
              scanf("%d",&num1);
              InSeQueue(&q1,num1);
              break;
              case 2:outSeQueue(&q1,&num2);
              printf("%d\n",num2);
            break;
            case 3:num3=Top_SeqStack(&q1);
            printf("取队列首个的元素为:%d\n",num3);
            break; 
            case 4:num4=EmptySeQueue(&q1);
            printf("判断结果为:%d\n",num4);
            printf("其中:1.为空,-1.为非空\n");
            break;
            case 5:num=0;
            break;
            case 6:num6=long_SeqStack(&q1);
            printf("队列的长度为:%d",num6);
            break;
            case 7:print(&q1);
            break;
            case 8:InitSeQueue1(&q1);
            break;
            default:
            printf("输入指令错误,请重输!\n");
          }
      }
    }

 

posted @ 2022-06-15 23:12  回忆也交给时间  阅读(34)  评论(0编辑  收藏  举报