顺序队列会发生假溢出的情况,具体运行情况请看效果截图,相关代码如下:
一、顺序队列的定义:
#include
#include
#include
#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
#define QUEUESIZE 10
typedef int Status;
typedef int QElemtype;
typedef struct QNode{
QElemtype *base;
int front;
int rear;
}SqQueue;
二、顺序队列的初始化:
void InitQueue(SqQueue *Q)
{
Q->base=(QElemtype*)malloc(sizeof(QElemtype)*QUEUESIZE);
assert(Q->base!=NULL);
Q->front=Q->rear=0;
}
三、入队操作:
Status EnQueue(SqQueue *Q,QElemtype e)
{
if(Q->rear==QUEUESIZE)
{
return ERROR;
}
Q->base[Q->rear]=e;
Q->rear++;
return OK;
}
四、判断队列是否为空:
Status QueueEmpty(SqQueue *Q)
{
if(Q->front==Q->rear)
{
return TRUE;
}
return FALSE;
}
五、求队列长度:
Status QueueLength(SqQueue Q)
{
return Q.rear-Q.front;
}
六、获取队头元素:
Status GetHead(SqQueue *Q,QElemtype *e)
{
if(Q->front==Q->rear)
{
return ERROR;
}
*e=Q->base[Q->front];
return OK;
}
七、销毁队列:
void DestoryQueue(SqQueue *Q)
{
if(Q->base) //队列Q存在
{
free(Q->base);
}
Q->base=NULL;
Q->front=Q->rear=0;
}
八、清空队列:
void ClearQueue(SqQueue *Q)
{
Q->front=Q->rear=0;
}
九、出队操作:
Status DeQueue(SqQueue *Q,QElemtype *e)
{
if(Q->front==Q->rear)
{
return ERROR;
}
*e=Q->base[Q->front];
Q->front++;
return OK;
}
十、遍历队列:
void QueueTraverse(SqQueue Q,void(*visit)(QElemtype))
{
int i=Q.front;
while(i!=Q.rear)
{
visit(Q.base[i]);
i++;
}
printf("\n");
}
void Print(QElemtype e)
{
printf("%d ",e);
}
十一、主函数:
int main()
{
QElemtype i,e,d;
SqQueue Q;
InitQueue(&Q);
printf("请输入队列的%d个元素:\n",QUEUESIZE);
for(i=0;i