兩種方法實現隊滿和隊空的判斷操作(循環隊列)


本周的作業要求:

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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM