笔记来自数据结构与算法 (王桂林)
如何判断循环队列的满和空,通过牺牲一个空间,来判断待压入指针与起始点是否重合。
#include <stdio.h>
//循环思想
int main()
{
int arr[10]={1,3,5,7,9,2,4,6,8,10};
for(int i=0;i<100;i++)
{
printf("%d ",arr[i%10]);
if((i+1)%10 == 0)
putchar(10);
}
return 0;
}
线式存储——实现队列
// myqueue.h
#ifndef MYQUEUE_H
#define MYQUEUE_H
typedef struct _Queue
{
char *_space;
int _len;
int _rear;
int _front;
}Queue;
void initQueue(Queue *q);
int isQueueFull(Queue *q);
int isQueueEmpty(Queue *q);
void enQueue(Queue *q , char ch);
char deQueue(Queue *q);
#endif
// myqueue.c
#include "myqueue.h"
void initQueue(Queue *q)
{
q->_len =size;
q->_space = (char*)malloc(sizeof(char)*q->_len));
q->_rear = q->_front = 0 ;
}
int isQueueFull(Queue *q)
{
return (q->_rear + 1)%q->_len == q->_front;
}
int isQueueEmpty(Queue *q)
{
return q->_front == q->_rear;
}
void enQueue(Queue *q , char ch)
{
q->_space[q->_rear] = ch;
q->_rear = ++q->_rear % q ->_len
}
char deQueue(Queue *q)
{
char ch = q->_sapce[q->_front];
q->_front = ++q->_front %q->_len ;
return ch;
}
// main.c
#include <stdio.h>
#include "myqueue.h"
int main()
{
Queue q;
initQueue(&q,26);
for(char ch = 'a'; ch<='z';ch++)
{
if(!isQueueFull(&q))
enQueue(&q,ch);
}
while(!isQueueEmpty(&q))
{
printf("%c ",deQueue(&q));
}
return 0;
}
链式存储——实现队列 (带头结点)
// myqueue.h
#ifndef __MYQUEUE_H
#define __MYQUEUE_H
typedef struct _Node
{
char data;
struct _Node *next;
}Node;
typedef struct _Queue
{
Node * front ;
Node * rear ;
}Queue
void initQueue(Queue *q);
int isQueueEmpty(Queue *q);
void enQueue(Queue *q , char ch);
char deQueue(Queue *q);
void resetQueue(Queue *q);
void clearQueue(Queue * q);
#endif
// myqueue.c
#include "myqueue.h"
#include <stdio.h>
void initQueue(Queue *q)
{
q->front = q->rear = (Node*)malloc(sizeof(Node));
q->front->next = NULL;
}
int isQueueEmpty(Queue *q)
{
return q->front == q->rear;
}
void enQueue(Queue *q , char ch)
{
Node * cur = (Node*)malloc(sizeof(Node));
cur->data = ch;
cur->next =NULL;
q->rear->next =cur;
q->rear =cur;
}
char deQueue(Queue *q)
{
char ch = q->front->next->data;
if(q->front->next == q->rear) //特殊情况:front的下一节点是rear,rear回到front的位置
{
q->rear = q->front;
free(q->front->next); //去掉移除队列的位置
q->front->next =NULL;
}else{
Node *t = q -> front -> next;
q->front->next = t->next;
free(t);
}
return ch
}
void resetQueue(Queue *q)
{
Node *head = q->front->next;
q->front->next = NULL;
q->rear = q->front
Node *t;
while(head)
{
t=head->next;
free(head);
head = t;
}
}
void clearQueue(Queue * q)
{
resetQueue(q);
free(q->front);
}
// main.c
#include <stdio.h>
#include "myqueue.h"
int main()
{
Queue q;
initQueue(&q);
for(char ch = 'a'; ch<='z';ch++)
{
enQueue(&q,ch);
}
//resetQueue(&q);
while(!isQueueEmpty(&q))
{
printf("%c ",deQueue(&q));
}
//clearQueue(&q);
return 0;
}
不带头结点的链式存储方式(待补充)