尼采般地抒情

尼采般地抒情

尼采般地抒情

音乐盒

站点信息

文章总数目: 316
已运行时间: 1570

实验任务

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

}

评论区