C语言顺序循环队列

顺序循环队列的入队、出队、遍历操作

#include<stdio.h>
#include<stdlib.h>

#define TURE 1
#define FALSE 0
#define MAX_SIZE 30

/*  循环队列-顺序式实现   */


/*
    队列先进先出,
    限定插入只能在队尾进行,删除只能在队首进行。
*/

typedef struct{

    char element[ MAX_SIZE ];
    int front; //指向队首元素位置
    int rear;  //队列不为空时指向队尾元素的下一位置

}SeqQueue;


void InitQueue(SeqQueue *Q)
{
    Q->front =0;
    Q->rear = 0;
}


int IsEmpty(SeqQueue Q)
{
    //判断队空的条件,Q->front 是否等于 Q->rear
    if ( Q.front == Q.rear )
    {
        return TURE;
    }
    else
    {
        return FALSE;
    }
}


int EnQueue(SeqQueue *Q, char x)
{
    //判定队满的条件,牺牲一个元素空间,Q->rear+1 是否等于 Q->front
    if ( ( Q->rear+1 ) % MAX_SIZE == Q->front )
        return FALSE;

    //将元素x赋值到队尾位置
    Q->element[ Q->rear ] = x;

    //rear队尾标志向后移一位置
    Q->rear = ( Q->rear+1 ) % MAX_SIZE;

    return TURE;
}


int DeQueue(SeqQueue *Q, char *x)
{
    if ( Q->front == Q->rear )
        return FALSE;

    *x = Q->element[ Q->front ];

    Q->front = ( Q->front+1 ) % MAX_SIZE;

    return TURE;
}


//若队列不空,则用x返回队头元素
int GetHead(SeqQueue Q, char *x)
{
    if ( Q.front == Q.rear )
        return FALSE;

    *x = Q.element[ Q.front ];

    return TURE;
}


//清空队列
void ClearQueue(SeqQueue *Q)
{
    Q->front = Q->rear = 0;
}


//队列元素个数,画图理解
int QueueLen(SeqQueue Q)
{
    return (Q.rear - Q.front + MAX_SIZE) % MAX_SIZE;
}


//遍历队列元素
void TraverseQueue(SeqQueue Q)
{
    int i;

	i = Q.front;

    while ( i != Q.rear )
	{
		printf("%c ", Q.element[i]);
		i = ( i + 1 ) % MAX_SIZE;
	}

	printf("\n");
}


int main()
{
    int i, t, flag=1;
    char x;
    SeqQueue Q;

    //队列初始化
    InitQueue( &Q );

    printf("26字母入队!\n");

    for(i=1; i<=26; i++)
    {
        flag = EnQueue(&Q, i+'a'-1);

        if ( !flag )
        {
            printf("插入到 %c 时失败,请检查!\n", i+'a'-1);
            break;
        }
    }


    /*判断为空的这一步可以去掉*/
    printf("\n队列是否为空:");
    flag = IsEmpty( Q );

    if ( flag )
    {
        printf("空!\n");
    }
    else
    {
        printf("非空!\n");
    }


    printf("\n遍历队列元素:\n");
    TraverseQueue( Q );


    printf("\n队列元素个数:");
    t = QueueLen( Q );
    printf("%d\n", t);


    printf("\n----------------");
    printf("\n\n查看队头元素:");
    flag = GetHead(Q, &x);

    if ( flag )
    {
        printf("%c\n", x);
    }
    else
    {
        printf("查看队头元素失败!\n");
    }


    printf("\n遍历队列元素:\n");
    TraverseQueue( Q );


    printf("\n----------------");
    printf("\n\n队头元素出队!\n");
    flag = DeQueue(&Q, &x);

    if ( flag )
    {
        printf("\n出队成功!\n");
    }
    else
    {
        printf("\n出队失败!\n");
    }


    printf("\n遍历队列元素:\n");
    TraverseQueue( Q );


    printf("\n队列元素个数:");
    t = QueueLen( Q );

    printf("%d\n", t);

}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值