尼采般地抒情

公告栏

此网站主题为本人手写主题, 主题待开源···

站点信息

文章总数目: 298
已运行时间: 991
目录
  1. 实验任务
  2. 实验讨论
  3. 代码代码

尼采般地抒情

尼采般地抒情

公告栏

此网站主题为本人手写主题, 主题待开源···

站点信息

文章总数目: 298
已运行时间: 991

实验任务

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

}

评论区

Twikoo giscus