c语言 队列的运用

队列最主要的作用啊是用来管理数据流的,防止数据因为传输频率过快得不到及时处理而丢失。

队列的原理就是先进先出,类似于管道

循环队列的引用 正常的队列出队和入队都是通过队首和队尾指针的移位来实现的 如果用正常的顺序队列的话 buff也会根据首尾指针的移位而一直增加其分配的数据存储空间,为解决这一问题我们引用了循环队列  

跟着程序进行逻辑讲解 

queue.h中定义队列结构体

typedef struct                                //队列的结构定义
{
    int *base ;                                 队列缓存指针
    int front ;                                  首地址指针
    int rear ;                                   尾地址指针
} SqQueue ;                                        

#define MAXIZE 11                             //队列长度  跟初始化分配的内存空间

初始化队列 

void InitQueue( SqQueue *Q )                                   
{
    Q->base = ( int* )malloc( sizeof( int ) * MAXIZE ) ;       
    Q->front = Q->rear = 0 ;

}     C 库函数 void *malloc(size_t size) 分配所需的内存空间,并返回一个指向它的指针。

首尾地址指向0

入队

void EnQueue( SqQueue *Q , int val )                    
{
    if( ( Q->rear + 1 ) % MAXIZE == Q->front )  DeQueue(Q);               //用来保证队列满的时候,数组仍留出一个空闲空间  判断队满后出队一个 然后再让数据入队
        Q->base[ Q->rear ] = val ;
        Q->rear = ( Q->rear +1 ) % MAXIZE ;
}   ( Q->rear +1 ) % MAXIZ(加一% MAXIZE 求余的含义就是让指针在0到MAXIZE循环)

出队

void DeQueue( SqQueue *Q  )                                          //出队         
{
    if( Q->front == Q->rear )  return;                               //队中没有数据
    else Q->front = ( Q->front + 1 ) % MAXIZE ;
}   同上一样

运用小技巧就是我们可以直接用(Q.base[Q.rear])-(Q.base[Q.front])首尾指针来获取我们当前的起始队列数据  进行运算  或者可以通过指针(+-)来获取当前队列任何一处的数据

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include #include #include //队列最大长度 #define MAX_QUEUE 1024 //偷懒,就用静态队列了 static int mQueue[MAX_QUEUE]; //队列插入 void InsertData(int **Front, int **Rear) { if (*Rear + 1 == *Front && (*Rear + 1 - MAX_QUEUE != *Front)) { //当队列数据已满,返回 puts("Queue Size Overflow!\n"); return; } else if (*Rear - mQueue > MAX_QUEUE) { //实现的是类似循环队列,但由于是静态线性队列(数组) //而不是用链表来实现的,所以到静态队列(数组)尾部,尾指针自动指向(数组)头部 *Rear = mQueue; } puts("Input Data:"); scanf("%d", *Rear); //输入数据后,尾指针后移 *Rear += 1; } //从头指针删除一个队列中的数据 void DeleteData(int **Front, int **Rear) { if (*Front == *Rear) { //头指针尾指针重合,队列空,不能删除,返回 puts("Queue Empty!\n"); return; } else if (*Front - mQueue > MAX_QUEUE) { //参考 Rear *Front = mQueue; } //从头指针删除一个数据 *Front += 1; } //显示队列数据 void ShowData(int **Front, int **Rear) { int *temp; for (temp=*Front; temp!=*Rear; temp++) { printf("%d --> ", *temp); } puts("\n"); } void usage(void) { puts("1. Insert Data"); puts("2. Delete Data"); puts("3. Show Data"); } int main(int argc, char **argv) { //头指针,尾指针 //队列的一个特性 First in first out FIFO int *pFront, *pRear; int op_code; //初始化队列,头指针和尾指针此时指向的地址相同 pFront = pRear = mQueue; while (1) { usage(); scanf("%d", &op_code); switch (op_code) { case 1: printf("%p\n", pFront); printf("%d\n", *pFront); InsertData(&pFront, &pRear); break; case 2: DeleteData(&pFront, &pRear); break; case 3: ShowData(&pFront, &pRear); break; default: break; } } return 0; }
实现二叉树的层序遍历需要用到队列这一数据结构,具体实现步骤如下: 1. 定义一个队列结构体,并实现队列的基本操作,包括入队、出队、队列是否为空等。 ``` typedef struct QueueNode { TreeNode *val; struct QueueNode *next; } QueueNode; typedef struct { QueueNode *front; QueueNode *rear; int size; } Queue; Queue *createQueue() { Queue *q = (Queue*)malloc(sizeof(Queue)); q->front = q->rear = NULL; q->size = 0; return q; } bool isEmpty(Queue *q) { return q->size == 0; } void enqueue(Queue *q, TreeNode *val) { QueueNode *newNode = (QueueNode*)malloc(sizeof(QueueNode)); newNode->val = val; newNode->next = NULL; if (isEmpty(q)) { q->front = q->rear = newNode; } else { q->rear->next = newNode; q->rear = newNode; } q->size++; } TreeNode *dequeue(Queue *q) { if (isEmpty(q)) { return NULL; } QueueNode *node = q->front; TreeNode *val = node->val; q->front = q->front->next; if (q->front == NULL) { q->rear = NULL; } free(node); q->size--; return val; } ``` 2. 实现二叉树的层序遍历,使用队列来存储当前层的节点,并逐层遍历。 ``` void levelOrder(TreeNode *root) { if (root == NULL) { return; } Queue *q = createQueue(); enqueue(q, root); while (!isEmpty(q)) { int levelSize = q->size; for (int i = 0; i < levelSize; i++) { TreeNode *node = dequeue(q); printf("%d ", node->val); if (node->left != NULL) { enqueue(q, node->left); } if (node->right != NULL) { enqueue(q, node->right); } } printf("\n"); } } ``` 以上代码实现了二叉树的层序遍历,可以通过以下测试代码进行测试: ``` int main() { TreeNode *root = createTree(); printf("层序遍历结果:\n"); levelOrder(root); return 0; } ``` 其中,`createTree()` 是创建一个二叉树的函数,可以根据需要自行实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值