数据结构C语言—线性表【队列】静态顺序队列(定义结构体变量实现)(具有自动调整功能防止假溢出)
【注1】实现了一个自动调整队列在队列空间分布的函数,解决普通数组的静态队列假溢出状态;
【注2】自动调整函数的被动触发:在入队函数调用时(遇到假溢出先调整再入队)、在出队函数调用时(遇到假溢出先调整再出队);
【注3】自动调整函数的主动执行:手动调用自动调整函数Status AutoMemory_Queue(SqQueuePonit Q)即可。
【注4】由于测试极限与假溢出情况需要,故只将队列空间数组元素个数设置为6(MAXSIZE),使用时可修改该宏定义!
SqQueuestatic.h
#define MAXSIZE 6
#define NOINIT -1
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE 1
#define OVERFLOW 1
typedef int Status;
typedef int DataType;
typedef int *Pt;
typedef struct SqQueue
{
DataType rear;
DataType front;
DataType length;
DataType data[MAXSIZE];
}SqQueue,*SqQueuePonit;
Status InitQueue(SqQueuePonit Q);
Status ClearQueue(SqQueuePonit Q);
Status IsEmptyQueue(SqQueuePonit Q);
DataType QueueLength(SqQueuePonit Q);
Status GetTop_Queue(SqQueuePonit Q,Pt e);
Status Push_Queue(SqQueuePonit Q,DataType e);
Status Pop_Queue(SqQueuePonit Q,Pt e);
Status QueueTraverse(SqQueuePonit Q,Status (*Visit)(SqQueuePonit Q,DataType p));
Status Visit(SqQueuePonit Q,DataType p);
Status IsVirFull_Queue(SqQueuePonit Q);
Status AutoMemory_Queue(SqQueuePonit Q);
SqQueuestatic.c
#include "SqQueuestatic.h"
#include <stdio.h>
Status InitQueue(SqQueuePonit Q)
{
puts("\n|<=====================开始【初始化队列】操作!=====================>|");
Q->front = 0;
Q->rear = Q->front;
Q->length = 0;
for(int i = 0;i<MAXSIZE;i++)
{
(Q->data)[i]=0;
}
puts("|<=====================完成【初始化队列】操作!=====================>|");
return OK;
}
Status ClearQueue(SqQueuePonit Q)
{
if(Q->front >= MAXSIZE || Q->front < 0 || Q->rear > MAXSIZE || Q->rear < 0 || Q->front > Q->rear)
{
puts("\n|!===========静态顺序队列【未初始化】不能执行【清空】操作===========!|");
return NOINIT;
}
puts("\n|<===================开始【清空】静态顺序队列!=====================>|");
Q->front=Q->rear=0;
Q->length = 0;
puts("|<===================【清空】静态顺序队列完成!=====================>|");
return OK;
}
Status IsEmptyQueue(SqQueuePonit Q)
{
if(Q->front >= MAXSIZE || Q->front < 0 || Q->rear > MAXSIZE || Q->rear < 0 || Q->front > Q->rear)
{
puts("\n|!===========静态顺序队列【未初始化】不能执行【判空】操作===========!|");
return NOINIT;
}
if(Q->front==Q->rear)
{
return TRUE;
}
else
{
return FALSE;
}
}
DataType QueueLength(SqQueuePonit Q)
{
if(Q->front >= MAXSIZE || Q->front < 0 || Q->rear > MAXSIZE || Q->rear < 0 || Q->front > Q->rear)
{
puts("\n|!===========静态顺序队列【未初始化】不能执行【求长】操作===========!|");
return NOINIT;
}
return Q->length = Q->rear - Q->front;
}
Status GetTop_Queue(SqQueuePonit Q,Pt e)
{
if(Q->front >= MAXSIZE || Q->front < 0 || Q->rear > MAXSIZE || Q->rear < 0 || Q->front > Q->rear)
{
*e = -6699;
puts("\n|!===========静态顺序队列【未初始化】不能执行【获头】操作===========!|");
return NOINIT;
}
if(IsEmptyQueue(Q) == TRUE)
{
*e=-6699;
puts("\n|!===========静态顺序队列【是空队列】不能执行【获头】操作===========!|");
return ERROR;
}
else
{
*e=Q->data[Q->front];
printf("当前静态顺序队列Q中,队头元素是:%d\n",*e);
return OK;
}
}
Status Push_Queue(SqQueuePonit Q,DataType e)
{
if(Q->front >= MAXSIZE || Q->front < 0 || Q->rear > MAXSIZE || Q->rear < 0 || Q->front > Q->rear)
{
puts("\n|!===========静态顺序队列【未初始化】不能执行【入队】操作===========!|");
return NOINIT;
}
if(QueueLength(Q) == MAXSIZE && Q->rear == MAXSIZE)
{
puts("\n|!===========静态顺序队列【队列真满】不能执行【入队】操作===========!|");
return ERROR;
}
else if(IsVirFull_Queue(Q) == TRUE)
{
puts("\n|!===========静态顺序队列【队列假满】开始执行【自调】操作===========!|");
AutoMemory_Queue(Q);
puts("\n|!===========静态顺序队列【自动调整】已经执行【完毕】操作===========!|");
Q->data[(Q->rear)++] = e;
(Q->length)++;
puts("\n|-===========静态顺序队列【加入队列】已经执行【完毕】操作===========>|");
return OK;
}
else
{
puts("\n|<===========静态顺序队列【有剩空间】开始执行【入队】操作===========-|");
Q->data[(Q->rear)++] = e;
(Q->length)++;
puts("\n|-===========静态顺序队列【加入队列】已经执行【完毕】操作===========>|");
return OK;
}
return ERROR;
}
Status Pop_Queue(SqQueuePonit Q,Pt e)
{
if(Q->front >= MAXSIZE || Q->front < 0 || Q->rear > MAXSIZE || Q->rear < 0 || Q->front > Q->rear)
{
*e = -6699;
puts("\n|!===========静态顺序队列【未初始化】不能执行【出队】操作===========!|");
return NOINIT;
}
if(IsEmptyQueue(Q) == TRUE)
{
*e=-6699;
puts("\n|!===========静态顺序队列【是空队列】不能执行【出队】操作===========!|");
return ERROR;
}
else if(IsVirFull_Queue(Q) == TRUE)
{
puts("\n|!===========静态顺序队列【队列假满】开始执行【自调】操作===========!|");
AutoMemory_Queue(Q);
puts("\n|!===========静态顺序队列【自动调整】已经执行【完毕】操作===========!|");
puts("\n|!===========静态顺序队列【空间正常】开始执行【出队】操作===========!|");
*e=(Q->data)[(Q->front)++];
printf("Q-FRONT:%d",Q->front);
(Q->length)--;
puts("\n|!===========静态顺序队列【空间正常】已经执行【完毕】操作===========!|");
return OK;
}
else
{
puts("\n|!===========静态顺序队列【空间正常】开始执行【出队】操作===========!|");
*e=(Q->data)[(Q->front)++];
printf("Q-FRONT:%d",Q->front);
(Q->length)--;
puts("\n|!===========静态顺序队列【空间正常】已经执行【完毕】操作===========!|");
return OK;
}
return ERROR;
}
Status QueueTraverse(SqQueuePonit Q,Status (*Visit)(SqQueuePonit Q,DataType p))
{
if(Q->front >= MAXSIZE || Q->front < 0 || Q->rear > MAXSIZE || Q->rear < 0 || Q->front > Q->rear)
{
puts("\n|!===========静态顺序队列【未初始化】不能执行【遍历】操作===========!|");
return NOINIT;
}
if(IsEmptyQueue(Q) == TRUE)
{
puts("\n|<=====================开始【全遍历队列】操作!=====================>|");
printf("队头指针----->%d:空<-----队尾巴指针\n",Q->front);
puts("|<=====================完成【全遍历队列】操作!=====================>|");
return ERROR;
}
else
{
puts("\n|<=====================开始【全遍历队列】操作!=====================>|");
DataType p;
printf("队尾指针----->%d\n",Q->rear);
for(p = Q->rear-1;p != Q->front - 1;p--)
{
Visit(Q,p);
}
puts("|<=====================完成【全遍历队列】操作!=====================>|");
return OK;
}
}
Status Visit(SqQueuePonit Q,DataType p)
{
if(p == Q->front)
{
printf("队头指针----->%d:%d\n",p,(Q->data)[p]);
}
else
{
printf(" %d:%d\n",p,(Q->data)[p]);
}
return OK;
}
Status IsVirFull_Queue(SqQueuePonit Q)
{
if(Q->front >= MAXSIZE || Q->front < 0 || Q->rear > MAXSIZE || Q->rear < 0 || Q->front > Q->rear)
{
puts("\n|!===========静态顺序队列【未初始化】不能执行【判假】操作===========!|");
return NOINIT;
}
if(Q->rear == MAXSIZE && QueueLength(Q) < MAXSIZE)
{
return TRUE;
}
else
{
return FALSE;
}
}
Status AutoMemory_Queue(SqQueuePonit Q)
{
int i;
int t = Q->front;
if(Q->front >= MAXSIZE || Q->front < 0 || Q->rear > MAXSIZE || Q->rear < 0 || Q->front > Q->rear)
{
puts("\n|!===========静态顺序队列【未初始化】不能执行【自调】操作===========!|");
return NOINIT;
}
puts("\n###@@!===========静态顺序队列【开始】【自动调整】操作===========!@@###");
for(i = 0;i < MAXSIZE;i++,t++)
{
if(t == Q->rear)
{
break;
}
else
{
Q->data[i] = Q->data[t];
}
}
Q->front = 0;
Q->rear = i;
puts("###@@!===========静态顺序队列【完成】【自动调整】操作===========!@@###");
return OK;
}
main.c
#include <stdio.h>
#include <stdlib.h>
#include "SqQueuestatic.h"
int main()
{
SqQueue Q;
int e;
GetTop_Queue(&Q,&e);
ClearQueue(&Q);
AutoMemory_Queue(&Q);
if(IsEmptyQueue(&Q) == TRUE)
{
printf("Q是空队列!\n");
}
else if(IsEmptyQueue(&Q) == FALSE)
{
printf("Q不是空队列!\n");
}
QueueLength(&Q);
Push_Queue(&Q,888);
Pop_Queue(&Q,&e);
QueueTraverse(&Q,Visit);
puts("\n为了方便测试极限情况与队列假溢出状态,设置队列空间数组元素个数为6(MAXSIZE)!");
InitQueue(&Q);
GetTop_Queue(&Q,&e);
AutoMemory_Queue(&Q);
if(IsEmptyQueue(&Q) == TRUE)
{
printf("Q是空队列!\n");
}
else if(IsEmptyQueue(&Q) == FALSE)
{
printf("Q不是空队列!\n");
}
printf("Q长度是:%d\n",QueueLength(&Q));
Push_Queue(&Q,888);
Pop_Queue(&Q,&e);
QueueTraverse(&Q,Visit);
ClearQueue(&Q);
puts("请按先后顺序,输入要入队的元素(空格分隔,f结束):");
while(1)
{
int n,k;
k=scanf("%d",&n);
if(k==0)
{
break;
}
Push_Queue(&Q,n);
}
QueueTraverse(&Q,Visit);
GetTop_Queue(&Q,&e);
puts("测试再入队一个元素999:\n");
Push_Queue(&Q,999);
QueueTraverse(&Q,Visit);
printf("Q长度:%d\n",QueueLength(&Q));
puts("测试再入队一个元素666:\n");
Push_Queue(&Q,666);
QueueTraverse(&Q,Visit);
printf("Q长度是:%d\n",QueueLength(&Q));
GetTop_Queue(&Q,&e);
puts("测试执行出队一个元素:\n");
Pop_Queue(&Q,&e);
QueueTraverse(&Q,Visit);
printf("Q长度是:%d\n",QueueLength(&Q));
puts("测试执行出队一个元素:\n");
Pop_Queue(&Q,&e);
QueueTraverse(&Q,Visit);
QueueTraverse(&Q,Visit);
GetTop_Queue(&Q,&e);
puts("测试再入队一个元素777:\n");
Push_Queue(&Q,777);
QueueTraverse(&Q,Visit);
puts("测试执行出队一个元素:\n");
Pop_Queue(&Q,&e);
QueueTraverse(&Q,Visit);
GetTop_Queue(&Q,&e);
puts("测试执行出队一个元素:\n");
Pop_Queue(&Q,&e);
QueueTraverse(&Q,Visit);
GetTop_Queue(&Q,&e);
puts("\n手动调用一次自调操作:");
AutoMemory_Queue(&Q);
QueueTraverse(&Q,Visit);
printf("Q长度是:%d\n",QueueLength(&Q));
ClearQueue(&Q);
QueueTraverse(&Q,Visit);
return 0;
}
运行结果示例
由于程序运行测试输出过多,因此分段截图,按顺序放置:
------------------------------------------------------第八次发文章有点激动啊!----------------------------------------------------- -----------------------------------------------------【数据结构代码自编练习】------------------------------------------------------ ----------------------------------------------------------------【TDTX】-----------------------------------------------------------------
|