一步两步学算法之顺序队列

顺序链表代码  非常简单;

但这个代码会有假溢出的状况出现;

就是在队尾已满的情况下,不断出队后

若在此时进行入队操作 判断队列已满的条件是q->head==q->tail 此时这个条件满足。 但实际队列之前已经出队了好几个,前面还有空余空间,这就是假溢出;(原谅我懒得画图)

假溢出解决办法

1.每次出队后 把所有数据都往前移。这种方法要移动大量数据,效率太低。

2.使用循环队列。这种方法明天再打。

 1 #define QUEUEMAX 15

 2 typedef struct 

 3 {

 4     DATA data[QUEUEMAX];        //队列数组 

 5     int head;                    //队头 

 6     int tail;                    //队尾 

 7 }SeqQueue;

 8 

 9 

10 

11 SeqQueue *SeqQueueInit()        //初始化队列 

12 {

13     SeqQueue *q;

14     if(q=(SeqQueue*)malloc(sizeof(SeqQueue)))   //分配内存

15     {

16         q->head=0;

17         q->tail=0;

18         return q;

19     }

20     else

21         return NULL;

22 }

23 

24 void SeqQueueFree(SeqQueue *q)

25 {

26     if(q!=NULL)

27         free(q);

28 }

29 

30 int SeqQueueIsEmpty(SeqQueue *q)

31 {

32     return (q->head==q->tail);                 //检查队列是否为空 

33 }

34 

35 int SeqQueueIsFull(SeqQueue *q)

36 {

37     return (q->tail==QUEUEMAX);                

38 }

39 

40 int SeqQueueLen(SeqQueue *q)                //获取队列长度 

41 {

42     return (q->tail-q->head);

43 }

44 

45 int SeqQueueIn(SeqQueue *q,DATA data)             //入队操作 

46 {

47     if(q->tail==QUEUEMAX)

48     {

49         printf("队列已满!\n");

50         return 0;

51     }

52     else

53     {

54         q->data[q->tail]=data;

55         tail++;

56         return 1;

57     }

58 }

59 

60 DATA *SeqQueueOut(SeqQueue *q)            //出队操作 

61 {

62     if(q->head==q->tail)

63     {

64         printf("队列为空!\n");

65         return NULL;

66     }

67     else

68     {

69         return &(q->data[q->head++]);

70     }

71 }

72 

73 DATA *SeqQueuePeek(SeqQueue *q)            //获取队头元素 

74 {

75     if(SeqQueueIsEmpty(q))

76     {

77         printf("队列为空!\n");

78         return NULL;

79     }

80     else

81     {

82         return &(q->data[q->head]);

83     }

84 }

 

你可能感兴趣的:(算法)