#include<iostream>
using namespace std;
const int MAXSIZE=100;
typedef int ElemType;
typedef struct
{
ElemType data[MAXSIZE];
int front;
int rear;
}SeqQueue;
void InitQueue(SeqQueue &Q)
{
Q.front=Q.rear=0;
}
void EnQueue(SeqQueue &Q,ElemType x)
{
if((Q.rear+1)%MAXSIZE==Q.front)
{
cout<<"队列已满"<<endl;
exit(1);
}
Q.rear=(Q.rear+1)%MAXSIZE;
Q.data[Q.rear]=x;
}
ElemType DeQueue(SeqQueue &Q)
{
if(Q.front==Q.rear)
{
cout<<"队列已空"<<endl;
exit(1);
}
Q.front=(Q.front+1)%MAXSIZE;
ElemType x=Q.data[Q.front];
return x;
}
bool QueueEmpty(SeqQueue &Q)
{
return Q.front==Q.rear;
}
bool QueueFull(SeqQueue &Q)
{
return (Q.rear+1)%MAXSIZE==Q.front;
}
int QueueLength(SeqQueue &Q)
{
return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
ElemType QueueMax(SeqQueue &Q)
{
int i;
int f=(Q.front+1)%MAXSIZE;
ElemType max=Q.data[f];
for(i=1;i<QueueLength(Q);i++)
if(max<Q.data[f+i])
max=Q.data[f+i];
return max;
}
int main()
{
SeqQueue Q;
int time=0;
ElemType e;
int x,flag,index;
InitQueue(Q);
cout<<"请输入打印队列,以-1结束:";
cin>>e;
while(e!=-1)
{
EnQueue(Q,e);
cin>>e;
}
cout<<"请输入需打印任务在队列中的位置:";
cin>>x;
if(x>QueueLength(Q))
{
cout<<"输入的位置有误!\n";
return 0;
}
flag=x; //设置需打印任务在队列中的位置
while(!QueueEmpty(Q))
{
e=DeQueue(Q);
flag--;
if(e<QueueMax(Q))
{
EnQueue(Q,e);
if(flag==0)
flag=QueueLength(Q);
}
else
{
time++;
if(flag==0)
break;
}
}
cout<<"完成打印任务所需时间为:"
<<time<<"min.\n";
return 0;
}
上面QueueMax
函数中有一行for(i=1;i<QueueLength(Q);i++)
,书上写的是i<=QueueLength(Q)
。请问需要加等号吗?
为什么运行结果都对呢?
等号不能加。
加了之后发现运行结果没差,很可能是
Q.front
指向的元素为零。这纯粹是巧合。如 @刘云宾 所言,
QueueMax
函数中,必须对数组索引做校验。请参考