一.实验目的
操作系统打印机管理器问题:先申请先打印。利用所学队列的相关知识,自行选择队列的实现模式,根据队列先进先出(FIFO)的特点设计算法实现打印机管理问题,代码难度根据自身情况而定。
二、实验目的
1、掌握并学会栈与队列相关知识
2、学会队列简单的出队,进队等基本操作
三.实验思路
//操作系统打印机管理器问题
#include<iostream>
using namespace std;
#define OVERFLOW -1
#define OK 1
#define ERROR 0
typedef int QElemType;
typedef struct QNode
{
QElemType data;
struct QNode* next;
}QNode, * QueuePtr;
typedef struct
{
QueuePtr front;//队头指针
QueuePtr rear;//队尾指针
}LinkQueue;
//基本操作
//初始化Q
void InitQueue(LinkQueue* Q)
{
Q->rear = NULL;
Q->front = NULL;
}
//入队
void EnQueue(LinkQueue* Q, QElemType e)
{
QueuePtr p = new QNode;
p->data = e;//赋值
p->next = NULL;
if (Q->rear != NULL)//判断原尾指针是否为空,若非空,则将新结点加入进去
{
p->next = Q->rear->next;
Q->rear->next = p;//原来的尾指针的next域指向新结点s
Q->rear = p;//更新尾指针
}
else//若为空,则头指针和尾指针均需指向该新结点
{
Q->front = p;//头指针更新
Q->rear = p;//尾指针更新
}
}
//出队
QElemType DeQueue(LinkQueue* Q, QElemType& e)
{
QueuePtr s = new QNode;
if (Q->rear == NULL)
printf("队列空");
else
{
s = Q->front;//s指向待出队结点
if (Q->front != Q->rear)//判断队列中是否仅有一个结点
Q->front = Q->front->next;//若当前队列中有不止一个结点,则更新头指针,使其指向原头指针的下一个结点即可
else
Q->front = Q->rear = NULL;//若当前队列中仅有一个结点,则更新头指针和尾指针,使二者均置为空
e = s->data;//返回值
delete s;//释放临时结点
return e;//返回
}
}
//打印
void printQueue(LinkQueue *Q)
{
QueuePtr p = Q->front;
while (p!= NULL)
{
cout << p->data << endl;
p = p->next;
}
};
//获取第i个位序上的打印信息
QElemType QueueMessage(LinkQueue* Q, int i, QElemType& e)
{
QueuePtr p = Q->front;
int j = 1;
while (p && j < i)
{
p = p->next, ++j;
}
if (!p || j > i)
cout << "当前位序无任务" << endl;
return ERROR;
e = p->data;
return e;
};
//判断链队列是否为空
int LinkQueueEmpty(LinkQueue* Q)
{
if (Q->rear == NULL)
return 0;//空
else
return 1;//非空
};
//定义提示菜单
void mymenu()
{
cout << "*****************************************************" << endl << endl;
cout << "1.加入打印任务 2.获取当前已有任务列表" << endl;
cout << "3.获取指定任务信息 4.完成已有任务中第一个任务" << endl;
cout << "5.当前是否有任务 6.退出系统" << endl << endl;
cout << "*****************************************************" << endl;
cout << "请输入1-6" << endl;
};
//跳转功能
void keydown(LinkQueue*Q)
{
int userkey = 0;
QElemType temp;//接受用户的输入
QElemType e;
int i;//任务位序
QueuePtr result;
cin >> userkey;
switch (userkey)
{
case 1:
cout << "---加入打印任务---" << endl;
cout << "请输入打印内容" << endl;
cin >> temp;
EnQueue(Q, temp);
break;
case 2:
cout << "---获取当前已有任务列表---" << endl;
printQueue(Q);
break;
case 3:
cout << "---获取指定任务信息---" << endl;
cout << "请输入要获取的任务位序" << endl;
cin >> i;
cout << "第" << i << "位序上的打印信息为" << QueueMessage(Q,i,e) << endl;
break;
case 4:
cout << "---完成已有任务中第一个任务---" << endl;
cout<<DeQueue(Q, e);
break;
case 5:
if (LinkQueueEmpty(Q))
cout << "当前有任务" << endl;
else
cout << "当前无任务" << endl;
break;
case 6:
cout << "---退出系统---" << endl;
break;
default:
cout << "请重新输入" << endl;
break;
}
};
int main()
{
LinkQueue* Q = new LinkQueue;
InitQueue(Q);
while (1)
{
mymenu();
keydown(Q);
system("pause");//按任意键继续
system("cls");//清屏
}
system("pause");
return 0;
}
四.实验结果
编辑
五、实验结果及分析
每个功能单独输出可以执行,但若是再一次运行中,就执行失败。
系统功能较少,只是基本的有关队列的操作,还需多加学习,及时改进。