Fork me on GitHub

两种方法实现队满和队空的判断操作(循环队列)

本周的作业要求:

1.给出循环队列的存储结构定义。
2.完成循环队列的基本操作函数。
         1)      初始化循环队列;
         2)      建立循环队列;
         3)      实现入队和出队操作;
         4)     采用下面两种方法实现对满和队空的判断操作:
   方法一:修改队满条件,浪费一个元素空间,队满时数组中只有一个空闲单元(必做);
   方法二:设置标志flag,当front==rear且flag=0时为队空,当front==rear且flag=1时为队满(必做);
 
3.编写主函数实现基本操作函数功能,并设置测试数据,测试合法和非法数据的输出结果;
4.程序调试运行并保存输出结果;
5.提交实验作业。
 

方法一:修改队满条件,浪费一个元素空间,队满时数组中只有一个空闲单元(必做);

 

#include <cstdio>
#include <cstdlib>
#include <cstring>
#define MAXSIZE 50
typedef struct
{
    char a[MAXSIZE];
    int front;
    int rear;
}SeqQueue;

int flag=0;

void deng(SeqQueue *Q);

void duiman(SeqQueue *Q)
{
    printf("队满,插入失败,返回登录界面\n");
    deng(Q);
}

void duikong(SeqQueue *Q)
{
    printf("队空,无元素出队,返回登陆界面\n");
    flag=0;
    deng(Q);
}

void EnterQueue(SeqQueue *Q,char x)
{
    if((Q->rear +1)%MAXSIZE==Q->front)
        duiman(Q);
    Q->a[Q->rear]=x;
    Q->rear=(Q->rear+1)%MAXSIZE;
    return;
}

void DeleteQueue(SeqQueue *Q)
{
    char x;
    if(Q->front==Q->rear)
        duikong(Q);
    x=Q->a[Q->front];
    Q->front=(Q->front+1)%MAXSIZE;
    if(flag==0){
        flag=1;
        DeleteQueue(Q);
    }else
        printf("出队的队头元素为%c\n",x);
    deng(Q);
}

void ru(SeqQueue *Q)
{
    printf("输入入队元素以$结束\n");
    char En[MAXSIZE];
    int i;
    for(i=0;i<MAXSIZE;i++){
        scanf("%c",&En[i]);
        if(En[i]!='$'){
            EnterQueue(Q,En[i]);
        }
        else
            break;
    }
    printf("入队成功!\n");
    deng(Q);
}

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

void deng(SeqQueue *Q)
{
    printf("1.入队\n");
    printf("2.使队头元素出队,并返回它的值\n");
    printf("3.退出\n");
    int a;
    scanf("%d",&a);
    switch(a)
    {
    case 1:
        system("CLS");
        ru(Q);
    case 2:
        system("CLS");
        DeleteQueue(Q);
    case 3:
        exit(0);
    default:
        printf("输入不合法,请重新输入\n");
        deng(Q);
    }
}


int main()
{
    SeqQueue Q;
    InitQueue(&Q);
    deng(&Q);

    return 0;
}

方法二:设置标志flag,当front==rear且flag=0时为队空,当front==rear且flag=1时为队满(必做);

 

#include <cstdio>
#include <cstdlib>
#include <cstring>
#define MAXSIZE 50
typedef struct
{
    char a[MAXSIZE];
    int front;
    int rear;
}SeqQueue;

int flag=0,tag=0;


void deng(SeqQueue *Q);

void duiman(SeqQueue *Q)
{
    printf("队满,插入失败,返回登录界面\n");
    deng(Q);
}

void duikong(SeqQueue *Q)
{
    printf("队空,无元素出队,返回登陆界面\n");
    flag=0;
    deng(Q);
}

void EnterQueue(SeqQueue *Q,char x)
{
    if(tag==1&&Q->front==Q->rear)
        duiman(Q);
    Q->a[Q->rear]=x;
    Q->rear=(Q->rear+1)%MAXSIZE;
    return;
}

void DeleteQueue(SeqQueue *Q)
{
    char x;
    if(tag==0&&Q->front==Q->rear)
        duikong(Q);
    x=Q->a[Q->front];
    Q->front=(Q->front+1)%MAXSIZE;
    if(flag==0){
        flag=1;
        DeleteQueue(Q);
    }else{
        tag=0;
        printf("出队的队头元素为%c\n",x);
    }
    deng(Q);
}

void ru(SeqQueue *Q)
{
    printf("输入入队元素以$结束\n");
    char En[MAXSIZE];
    int i;
    for(i=0;i<MAXSIZE;i++){
        scanf("%c",&En[i]);
        if(En[i]!='$'){
            EnterQueue(Q,En[i]);
        }
        else
            break;
    }
    tag=1;
    printf("入队成功!\n");
    deng(Q);
}

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

void deng(SeqQueue *Q)
{
    printf("1.入队\n");
    printf("2.使队头元素出队,并返回它的值\n");
    printf("3.退出\n");
    int a;
    scanf("%d",&a);
    switch(a)
    {
    case 1:
        system("CLS");
        ru(Q);
    case 2:
        system("CLS");
        DeleteQueue(Q);
    case 3:
        exit(0);
    default:
        printf("输入不合法,请重新输入\n");
        deng(Q);
    }
}


int main()
{
    SeqQueue Q;
    InitQueue(&Q);
    deng(&Q);

    return 0;
}

 

posted @ 2016-10-23 23:26  Jinkelababy  阅读(8351)  评论(0编辑  收藏  举报