循环队列基本操作

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


#define OK 1
#define ERROR 0
#define MAXSIZE 4///分配的最大空间
typedef struct que
{
    int *base;///存数据
    int front;///队首
    int rear;///队尾
}queueLink;


int initLoopQueue(queueLink *);///初始化循环队列


int push_LoopQueue(queueLink *,int );///入队


int pop_LoopQueue(queueLink *,int *);///出队


int top_LoopQueue(queueLink ,int *);///查找队首


int print_LoopQueue(queueLink );///输出循环队列


void clear();///清屏函数


int main()
{
    queueLink Q;
    int choose;///菜单选择
    int n;///输入数据的变量
    do
    {
        ///页面设计
        printf("\t\t\t*********************************\n");
        printf("\t\t\t*1.循环队列的初始化\t\t*\n");
        printf("\t\t\t*2.循环队列的入队\t\t*\n");
        printf("\t\t\t*3.循环队列的出队\t\t*\n");
        printf("\t\t\t*4.取循环队列的队首元素\t\t*\n");
        printf("\t\t\t*5.循环队列的输出(从队首到队底) *\n");
        printf("\t\t\t*0.退出\t\t\t\t*\n");
        printf("\t\t\t*********************************\n");
        printf("\t\t\t请输入你需要操作的数字:");
        scanf("%d",&choose);
        if(choose==0)
        {
            printf("\t\t\t欢迎下来再使用!\n");
            break;
        }
        switch(choose)
        {
            case 1:
                if(initLoopQueue(&Q))///判断是否申请成功
                    puts("初始化成功");
                else
                    puts("初始化失败");
                break;
            case 2:
                printf("请输入你要入队的元素:");
                scanf("%d",&n);
                if(!push_LoopQueue(&Q,n))///判断是否队列满了,提示用户
                    puts("循环队列已满");
                break;
            case 3:
                if(pop_LoopQueue(&Q,&n))///判断是否还有数据可出队
                    printf("出队元素为:%d\n",n);
                else
                    printf("删除失败,循环队列为空的\n");
                break;
            case 4:
                if(top_LoopQueue(Q,&n))
                    printf("队首元素为:%d\n",n);
                else
                    printf("循环队列为空的,无队首\n");
                break;
            case 5:
                printf("循环队列的输出:");
                print_LoopQueue(Q)==OK?printf("输出完毕!\n"):printf("NULL\n");///三目运算符,判断队列是否为空的
                break;
            default:
                printf("输入错误,请重新输入\n");
                break;
        }
        clear();///清屏
    }while(1);
    return 0;
}


///初始化循环队列
int initLoopQueue(queueLink *Q)
{
    Q->base=(int *)malloc(MAXSIZE*sizeof(int ));///申请空间
    if(!Q->base)
        return ERROR;///申请失败返回ERROR


    Q->front=Q->rear=0;///循环队列一开始都是指向初始位置0
    return OK;///申请成功返回OK
}




///入队
int push_LoopQueue(queueLink *Q,int n)
{
    if((Q->rear+1)%MAXSIZE==Q->front)///每次入队之后,rear都会先指向下一个,所以先判断rear+1是不是到了front的位置,是的话说明队列满了
            return ERROR;///入队失败返回ERROR
    Q->base[Q->rear]=n;///空间足够就入队,
    Q->rear=(Q->rear+1)%MAXSIZE;///入队之后,rear要指向下一个,模它的最大空间,因为是循环队列
    return OK;///入队成功返回OK
}




///出队
int pop_LoopQueue(queueLink *Q,int *n)
{
    if(Q->front==Q->rear)///在出队之前先判断front和rear都指向同一个位置,如果是就跟初始化一样,也就是队列是空的
        return ERROR;///出队失败返回ERROR
    *n=Q->base[Q->front];///把出队的值赋值给n,n返回的时候进行输出
    Q->front=(Q->front+1)%MAXSIZE;///出队之后要指向下一个,因为循环队列,要取模MAXSIZE
    return OK;///出队成功返回OK
}




///查找队首元素
int top_LoopQueue(queueLink Q,int *n)
{
    if(Q.rear==Q.front)///rear和front指向同一个位置说明空的,查询失败返回ERROR
        return ERROR;
    *n=Q.base[Q.front];///把队首元素赋值给n,n进行返回并输出
    return OK;///查询成功返回OK
}


///输出循环队列
int print_LoopQueue(queueLink Q)
{
    ///Q在这里是局部变量,且在这Q不是指针类型,这里直接使用Q,不会改变Q的内容,只是输出
    if(Q.rear==Q.front)///rear和front指向同一个位置说明是空的,返回ERROR
        return ERROR;
    while(Q.rear!=(Q.front)%MAXSIZE)///循环队列输出的操作
    {
        Q.front%=MAXSIZE;
        printf("%d ",Q.base[Q.front++]);
    }
    puts("");
    return OK;
}


///清屏
void clear()
{
    printf("请按任意键继续......\n");
    getch();
    system("cls");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值