循环队列操作

来源:互联网 发布:淘宝互动平台在哪看 编辑:程序博客网 时间:2024/05/01 00:26
/*
circle_queue.cpp
循环队列
1.建栈 2.遍历。3.压栈 4.出栈 5.清栈
by adengou@foxmail.com
2012.07.09
vs2010 和dev++ 5.0编译通过
*/
//#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include<stdlib.h>
#include<malloc.h>
//队列结构
typedef struct Queue
{
    int *pBase;
    int front;
    int rear;
    int initLen;//初始化队列长度
}QUEUE,*PQUEUE;
//队列初始化
void initQueue(PQUEUE,int);
//遍历队列
void traversalQueue(PQUEUE);
//入队
bool enterQueue(PQUEUE,int);
//出队
bool outQueue(PQUEUE,int*);
//队列满
bool isFullQueue(PQUEUE);
//队列空
bool isEmptyQueue(PQUEUE pQueue);
//存在队列
bool existQueue(PQUEUE);
int main(void)
{
    int queueLen=0;
    int enterQueueVal=0;
    int outQueueVal=0;
    QUEUE mQueue;
    mQueue.initLen=0;
      
    printf("                   循环队列操作               \n");
    printf("**********************************************\n");
    printf("******            菜单选项              ******\n");
    printf("******                                  ******\n");
    printf("******    1.队列初始化     2.遍历队列   ******\n");
    printf("******    3.入队           4.出队       ******\n");
    printf("******    0.退出                        ******\n");
    printf("******                                  ******\n");
    printf("**********************************************\n");
    //栈初始化
    //initQueue(&mQueue,queueLen);
    while(1)
    {
        switch(getchar())
        {
        case '1':
            if(existQueue(&mQueue))
            {
                printf("队列已存在,你确定建立新队列吗?(Y/N):");
                if(getchar()=='Y' ||getchar()=='y' )
                {
                    printf("请输入队列长度:");
                    scanf("%d",&queueLen);
                    initQueue(&mQueue,queueLen);
                    break;
                }
                if(getchar()=='N' ||getchar()=='n' )
                {
                    break;
                }

            }
            else
            {
                printf("请输入队列长度:");
                scanf("%d",&queueLen);
                initQueue(&mQueue,queueLen);
            }

            break;
        case '2':
            traversalQueue(&mQueue);
            break;
        case '3':
            if(!existQueue(&mQueue)||isFullQueue(&mQueue))
            {
                break;
            }
            else
            {
                printf("请输入入队列值(以'q'结束):");
                while(1)
                {
                scanf("%d",&enterQueueVal);
                if(getchar()=='q')break;
                enterQueue(&mQueue,enterQueueVal);
                }
                printf("入队列成功!\n");
            break;
            }
        case '4':
             if(outQueue(&mQueue,&outQueueVal))
             {
                printf("出队列成功,值为:%d\n",outQueueVal);
             }else{
                printf("出队列不成功!\n");
                
             }

            break;
        case '0':
            exit(0);
            break;
        default:
            break;
        }
    }

    system("pause");
    return 0;
}
void initQueue(PQUEUE pQueue,int queueLen)
{
    pQueue->pBase=(int *)malloc(sizeof(int)*queueLen);
    if(pQueue->pBase==NULL)
    {
        printf("内存分配失败!\n");
        exit(-1);
    }
    pQueue->front=0;
    pQueue->rear=0;
    pQueue->initLen=queueLen+1;
    printf("队列初始化成功\n");
    return;
}
bool enterQueue(PQUEUE pQueue,int val)
{
    if(pQueue->initLen==0||((pQueue->rear+1)%pQueue->initLen)==pQueue->front)
    {
        return false;
    }
    else
    {
        pQueue->pBase[pQueue->rear]=val;
        pQueue->rear=(pQueue->rear+1)%pQueue->initLen;
        return true;
    }        
}
bool outQueue(PQUEUE pQueue,int* val )
{
    if(!existQueue(pQueue)||isEmptyQueue(pQueue))
    {
        return false;
    }
    else
    {    
        *val=pQueue->pBase[pQueue->front];    
        pQueue->front=(pQueue->front+1)%pQueue->initLen;
        return true;
    }    
}
bool isFullQueue(PQUEUE pQueue)
{
    if((pQueue->rear+1)%pQueue->initLen==pQueue->front)
    {
        printf("队列满!\n");
        return true;
    }
    else
    {
        return false;
    }

}
bool existQueue(PQUEUE pQueue)
{
    if(pQueue->initLen==0)
    {
        printf("队列未初始化!\n");
        return false;
    }
    else
    {
        return true;
    }
}
void traversalQueue(PQUEUE pQueue)
{
    if(!existQueue(pQueue)||isEmptyQueue(pQueue))
    {
        return;
    }
    else
    {
         printf("当前队列是:");

         int i=pQueue->front;
         while(i!=pQueue->rear)
         {
             printf("%d  ",pQueue->pBase[i]);
             i=(i+1)%pQueue->initLen;
         }
         printf("\n");
         return;
        
    }
}
bool isEmptyQueue(PQUEUE pQueue)
{
    if(pQueue->rear==pQueue->front&pQueue->initLen!=0)
    {
        printf("空队列!\n");
        return true;
    }else{
        return false;
        
    }
}


原创粉丝点击