61.png

    1. /*
    2. 若希望循环队列中的元素都能得到利用,则需设置一个标志域tag,并以tag 的值为0或1来区分队头指针front和队尾指针rear
    3. 相同时的队列状态是“空”还是“满”。试编写此结构相应的入队和出队算法。
    4. 分析:
    5. */
    6. #include <stdio.h>
    7. #include <stdlib.h>
    8. #define TYPE int
    9. struct Squeue {
    10. TYPE *arr;
    11. int front, rear;
    12. int tag;
    13. };
    14. //创建队列
    15. Squeue *create(int n) {
    16. struct Squeue *sq = (struct Squeue *)malloc(sizeof(struct Squeue));
    17. sq->arr = (TYPE *)malloc(sizeof(TYPE)*n);//数组大小
    18. sq->front = 0;
    19. sq->rear = 0;
    20. sq->tag = 0;
    21. return sq;
    22. }
    23. //判断队满
    24. bool isFull(Squeue *sq, int maxSize) {
    25. return (sq->rear == sq->front) && (sq->tag == 1);
    26. }
    27. //判断队空
    28. bool isEmpty(Squeue *sq) {
    29. return (sq->front == sq->rear) && sq->tag==0;
    30. }
    31. //判断队列中元素个数
    32. int count(Squeue *sq, int maxSize) {
    33. return (sq->rear - sq->front + maxSize) % maxSize;
    34. }
    35. //入队
    36. bool enQueue(Squeue *sq, int data, int maxSize) {
    37. if (isFull(sq, maxSize)) return false;
    38. sq->arr[sq->rear] = data;
    39. sq->rear = (sq->rear + 1) % maxSize;
    40. sq->tag = 1;
    41. return true;
    42. }
    43. //出队
    44. bool deQueue(Squeue *sq, int &data, int maxSize) {
    45. if (isEmpty(sq)) return false;
    46. data = sq->arr[sq->front];
    47. sq->front = (sq->front + 1) % maxSize;
    48. sq->tag = 0;
    49. return true;
    50. }