尼采般地抒情

尼采般地抒情

尼采般地抒情

音乐盒

站点信息

文章总数目: 318
已运行时间: 1825

实验任务

   实验4:队列的链式表示和实现

   要求:某小超市有两个排队机,构建2个用带头结点的单链表队列QA和QB, 实现下列操作

       1、初始化队列(清空);

       2、入队;

       3、出队;

       4、求队列长度;

       5、判断队列是否为空;

       6、判断队列是否为满;

       7、对于队列QA和QB,如果其中一个队列的售货员下班,则自动甩到另一个队列后面。

截止日期:4月22日

实验讨论


觉得问题里面有bug


对问题判满的疑惑与解决,第六个问题对链对判满是否有意义,如果是链式存储,数据结构本身判断满没有意义,但是考虑到是小型超市,超市空间不大,所以对其进行一开始的用户自己输入两个队列的最大长度。


但是这样又有一个问题,在问题7中,如果一个队列的售货员下班了,这个队列的所有人排到另一个队列中,那如果新队列的长度超出用户输入的队列最大长度呢?考虑到实际问题,这个问题不打算解决了,让他们挤挤……

代码代码

#include<bits/stdc++.h>
using namespace std;

typedef int Status;
typedef int QElemType;

#define OVERFLOW -1
#define ERROR 0
#define OK 1

/**
    实验4:队列的链式表示和实现
    要求:某小超市有两个排队机,构建2个用带头结点的单链表队列QA和QB, 实现下列操作
        1、初始化队列(清空);
        2、入队;
        3、出队;
        4、求队列长度;
        5、判断队列是否为空;
        6、判断队列是否为满;
        7、对于队列QA和QB,如果其中一个队列的售货员下班,则自动甩到另一个队列后面。

 */

/* 存储形式 */
typedef struct QNode{ //链队用的结点
    QElemType data;
    struct QNode *next;
}QNode,*QueuePtr;

typedef struct {
    QueuePtr front;
    QueuePtr rear;
}LinkQueue;

/* 初始化 */
Status InitQueue(LinkQueue &queue) {
    queue.front = queue.rear = new QNode;
    queue.front->next = NULL;
    return OK;
}

/* 求队列长度 */
Status QueueLength(LinkQueue &queue) {
    int count = 0;
    if (queue.rear == queue.front) {
        return count;
    }
    QueuePtr temp = queue.front;
    while (temp != queue.rear) {
        count++;
        temp = temp->next;
    }
    return count;
}

/* 入队 */
Status EnQueue(LinkQueue &queue, QElemType e, int length) {
    if (QueueLength(queue) <length) {
        QueuePtr temp = new QNode;
        temp->data = e;
        temp->next = NULL;
        queue.rear->next = temp;
        queue.rear = temp;
        return OK;
    } else {
        cout << "队已经满了,不能再入元素了"<< "\n";
        return ERROR;
    }
}

/* 出队 */
Status DeQueue(LinkQueue &queue) {
    if (queue.front == queue.rear) {
        return OVERFLOW;
    }
    // 有必要定义一个p,不然头结点会掉
    QueuePtr p = queue.front->next;
    QElemType e = p->data;
    queue.front->next = p->next;
    // 考虑最后一个元素被删,队尾指针指向头结点
    if (queue.rear == p) {
        queue.rear = queue.front;
    }
    return e;
}

/* 取队头元素 */
// Status GetHead(LinkQueue &queue) {
//     if (queue.front != queue.rear){
//         return queue.front->next->data;
//     }
// }



/* 判断队列是否为空 */
bool QueueIsEmpty(LinkQueue &queue) {
    if (queue.rear == queue.front) {
        return true;
    } else {
        return false;
    }
}

/**
 * 判断队列是否为满
 * 不是很理解为什么链队需要判断是否为满呢?
 * 采用输入链队长度,利用链队函数来判断
 * 那么入队的代码需要输入length参数来判断是否还能让元素入队
 */
bool QueueIsFull(LinkQueue &queue, int length) {
    if (QueueLength(queue) == length) {
        return true;
    } else {
        return false;
    }
}

/* 一个队列甩到另一个队列 */
Status QueueMove(LinkQueue &queue_delete,LinkQueue &queue_add) {
    queue_add.rear->next = queue_delete.front->next;
    queue_add.rear = queue_delete.rear;
    return OK;
}

/* 遍历查看队列元素 */
Status DisplayQueue(LinkQueue &queue) {
    LinkQueue L = queue;
    while (L.front->next != NULL) {
        cout << L.front->next->data << " ";
        L.front = L.front->next;
    }
    cout << "\n";
    return OK;
}

int main() {
 
    cout<<"------------------------链队菜单----------------------"<<'\n';
    cout<<"操作0:退出程序"<<'\n';
    cout<<"操作1:初始化两队列"<<'\n';
    cout<<"操作2:入队操作"<<'\n';
    cout<<"操作3:出队操作"<<'\n';
    cout<<"操作4:判断判断链队是否为空"<<'\n';
    cout<<"操作5:判断判断链队是否为满"<<'\n';
    cout<<"操作6:售货员偷懒选项"<<'\n';
    cout<<"操作7:查看队列"<<'\n';
    cout<<"操作8:求队列长度"<<'\n';
    cout<<"--------------------------------------------------------"<<'\n';
    int a, length,flag = 1;
    cout << "请输入你希望排队机最多能排的人数:"<<"\n"<<"\n";
    cin >> length;
    LinkQueue QA,QB;
    while(flag)
    {
        cout<<'\n'<<"请选择要执行的操作:";
        while(cin>>a)
        {
            if(a < 0 || a > 8)
                cout<<"请选择正确操作编号:";
            else
                break;
        }
        switch(a)
        {
            case 0:
            {
                cout<<"正在退出程序中……"<<'\n';
                flag = 0;
                break;
            }
            case 1:
            {
                cout<<"初始化QA、QB队列中……"<<'\n';
                InitQueue(QA);
                InitQueue(QB);
                break;
            }
            case 2:
            {
                cout<<"请输入入队的队列(QA输入1,QB输入2)"<<'\n';
                int select_queue;
                cin >> select_queue;
                if (select_queue == 1) {
                    cout<<"请输入入QA队的队列的元素"<<'\n';
                    int select_queue_A;
                    cin >> select_queue_A;
                    EnQueue(QA, select_queue_A, length);
                } else if (select_queue == 2) {
                    cout<<"请输入入QB队的队列的元素"<<'\n';
                    int select_queue_B;
                    cin >> select_queue_B;
                    EnQueue(QB, select_queue_B, length);
                } else {
                    cout << "输入有误!"<< "\n";
                }
                break;
            }
            case 3:
            {
                cout<<"请输入需要出队的队列(QA输入1,QB输入2)"<<'\n';
                int select_queue;
                cin >> select_queue;
                if (select_queue == 1) {
                    DeQueue(QA);
                } else if (select_queue == 2) {
                    DeQueue(QB);
                } else {
                    cout << "输入有误!"<< "\n";
                }
                break;
            }
            case 4:
            {
                cout<<"请输入需要判空的队列(QA输入1,QB输入2)"<<'\n';
                int select_queue;
                cin >> select_queue;
                if (select_queue == 1) {
                    cout << "QA队列为空吗?"<< boolalpha << QueueIsEmpty(QA) << "\n";
                } else if (select_queue == 2) {
                    cout << "QB队列为空吗?"<< boolalpha << QueueIsEmpty(QB) << "\n";
                } else {
                    cout << "输入有误!"<< "\n";
                }
                break;
            }
            case 5:
            {
                cout<<"请输入需要判满的队列(QA输入1,QB输入2)"<<'\n';
                int select_queue;
                cin >> select_queue;
                if (select_queue == 1) {
                    cout << "QA队列为满吗?"<< boolalpha << QueueIsFull(QA,length) << "\n";
                } else if (select_queue == 2) {
                    cout << "QB队列为满吗?"<< boolalpha << QueueIsFull(QB,length) << "\n";
                } else {
                    cout << "输入有误!"<< "\n";
                }
                break;
            }
            case 6:
            {
                cout<<"请输入下班的售货员(QA输入1,QB输入2)"<<'\n';
                int select_queue;
                cin >> select_queue;
                if (select_queue == 1) {
                    QueueMove(QA, QB);
                } else if (select_queue == 2) {
                    QueueMove(QB, QA);
                } else {
                    cout << "输入有误!"<< "\n";
                }
                break;
            }
            case 7:
            {
                cout<<"请输入要查看的队列(QA输入1,QB输入2)"<<'\n';
                int select_queue;
                cin >> select_queue;
                if (select_queue == 1) {
                    DisplayQueue(QA);
                } else if (select_queue == 2) {
                    DisplayQueue(QB);
                } else {
                    cout << "输入有误!"<< "\n";
                }
                break;
            }
            case 8:
            {
                cout<<"请输入要查看的队列的长度(QA输入1,QB输入2)"<<'\n';
                int select_queue;
                cin >> select_queue;
                if (select_queue == 1) {
                    cout<<QueueLength(QA)<< "\n";
                } else if (select_queue == 2) {
                    cout<<QueueLength(QB)<< "\n";
                } else {
                    cout << "输入有误!"<< "\n";
                }
                break;
            }
        }
    }
}

评论区

什么都不舍弃,什么也改变不了