1.数据类型定义
在代码中为了清楚的表示一些错误和函数运行状态,我们预先定义一些变量来表示这些状态。在head.h头文件中有如下定义:
//定义数据结构中要用到的一些变量和类型
#ifndef HEAD_H
#define HEAD_H
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2 //分配内存出错
typedef int Status; //函数返回值类型
typedef int ElemType; //用户定义的数据类型
#endif
2.数据结构定义
typedef struct Queue{
ElemType *data;
int head;
int tail;
int capacity;
}Queue,*pQueue;
3.队列顺序实现
LinerQueue.h中实现代码如下:
#ifndef LINARQUEUE_H
#define LINARQUEUE_H
#include "head.h"
#define INIT_QUEUE_CAPACITY 100
#define QUEUE_ICREMENT_SIZE 10
typedef struct Queue{
ElemType *data;
int head;
int tail;
int capacity;
}Queue,*pQueue;
//初始化队列
Status InitQueue(pQueue &Q){
Q=(pQueue)malloc(sizeof(Queue));
if(!Q) return OVERFLOW;
Q->data=(ElemType*)malloc(INIT_QUEUE_CAPACITY*sizeof(ElemType));
if(!Q->data) return OVERFLOW;
Q->head=0;
Q->tail=0;
Q->capacity=INIT_QUEUE_CAPACITY;
return OK;
}
//销毁队列
Status DestroyQueue(pQueue &Q){
free(Q->data);
Q->head=0;
Q->tail=0;
Q->capacity=0;
free(Q);
Q=NULL;
return OK;
}
//清空队列
Status ClearQueue(pQueue &Q){
if(Q==NULL) return ERROR;
Q->head=0;
Q->tail=0;
Q->capacity=INIT_QUEUE_CAPACITY;
return OK;
}
//队列是否为空
Status QueueEmpty(pQueue Q){
if(Q==NULL) return ERROR;
return Q->head==Q->tail;
}
//队列长度
Status QueueLength(pQueue Q){
if(Q==NULL) return ERROR;
return Q->tail-Q->head;
}
//取得队头数据
Status GetHead(pQueue Q,ElemType &e){
if(QueueLength(Q)==0) return ERROR;
e=Q->data[Q->head];
return OK;
}
//从队尾插入数据
Status InsertQueue(pQueue &Q,ElemType e){
if(QueueLength(Q)>=Q->capacity){
Q->data=(ElemType*)realloc(Q->data,(Q->capacity+QUEUE_ICREMENT_SIZE)*sizeof(ElemType));
if(!Q->data) return OVERFLOW;
Q->capacity+=QUEUE_ICREMENT_SIZE;
}
Q->data[Q->tail++]=e;
return OK;
}
//从队头删除数据
Status DeleteQueue(pQueue &Q,ElemType &e){
if(Q==NULL) return ERROR;
GetHead(Q,e);
for (int i=Q->head+1;i<=Q->tail;i++)
{
Q->data[i-1]=Q->data[i];
}
Q->tail--;
return OK;
}
//用(*visit)()遍历队列
Status QueueTraverse(pQueue &Q,Status (*visit)(ElemType)){
for (int i=Q->tail-1;i>=Q->head;i--)
{
(*visit)(Q->data[i]);
}
return OK;
}
Status print(ElemType e){
printf("%d->",e);
return true;
}
//输出队列
Status printQueue(pQueue Q){
if(Q==NULL) return ERROR;
printf("\ntail->");
QueueTraverse(Q,print);
printf("head\n");
return true;
}
#endif
4.测试栈
#include "LinerQueue.h"
void main(){
pQueue Q;
InitQueue(Q);
for (int i=0;i<10;i++)
{
InsertQueue(Q,i);
}
ElemType e2;
DeleteQueue(Q,e2);
printf("\n删除队列头:%d",e2);
printQueue(Q);
printf("\n队列长度:%d",QueueLength(Q));
ElemType e;
GetHead(Q,e);
printf("\n队列头:%d",e);
ClearQueue(Q);
DestroyQueue(Q);
}
5.测试结果
删除队列头:0
tail->9->8->7->6->5->4->3->2->1->head
队列长度:9
队列头:1