队列:在表的一端输入,另一端删除。有先后顺序存储。
允许插入的为队尾(rear),允许删除的为队头(front)。
队列的特点是先进先出。
出队列:sq.rear=sq.rear+1
队列空:sq.front=sq.rear//不能只凭这个判断循环队列的状态是空还是满。
入队:sq.rear=(sq.rear+1)%maxsize
sq.elem[sq.rear]=x
出队:sq.rear=(sq.front+1)%maxsize
#define maxsize typedef struct { elementype elem[maxsize]; int front,rear;//队头front,队尾rear }squeuetp; void InitQueue(cqueuetp *sq) { sq->front = 0; sq->rear = 0; } void main() { cqueuetp *sq; s1 = (cqueuetp *)malloc(sizeof(cqueuetp)); InitQueue(sq); } int QueueEmpty(cquequetp *sq) { if(sq->rear==sq->front) return 1; else return 0; } int Size(cqueuetp *sq) { return ((maxsize+sq->rear-sq->front)%maxsize); } elemtype Head(cqueuetp *sq) { if(sq->front==sq->rear) return NULL; else return (sq->elem[(sq->front+1)%maxsze]); }
重点:
void EnQueue(cqueuetp *sq,elementype x)//没满则插入x作为新的队尾元素 { if((sq->rear+1)%maxsize==sq->front) { printf("overflow"); } else { sq->rear = (sq->rear+1)%maxsize; sq->elem[sq->rear]=x; } } elementype DelQueue(cqueuetp *sq) { if(sq->front==sq->rear) { return NULL; } else { sq->front = (sq->front+1)%maxsize; return sq->elem[sq->front]; } }