第7周项目4-队列数组

/*      
Copyright (c)2016,烟台大学计算机与控制工程学院      
All rights reserved.      
文件名称:第7周项目项目4 - 队列数组.cpp      
作    者:孟琪琪     
完成日期:2016年10月8日      
版 本 号:v1.0      
      
问题描述:创建10个队列,分别编号为0-9(处理为队列数组,编号即下标)。
          输入若干个正整数,以数字0作为结束。设输入的值为x,其个位数字的大小为i,则将x插入到编号为i的队列中。
          最后输出所有的非空队列。 要求将队列处理成链式队列,使用链式队列算法库中定义的数据类型及算法,
          程序中只包括一个函数(main函数),入队和出队等操作直接在main函数中调用即可。 
输入描述:若干数据。
程序输出:分组后的若干数据。
*/

#include <stdio.h>
#include <malloc.h>
#include "liqueue.h"
#define N 10

int main()
{
    int i, a;
    LiQueue *qu[N]; //定义队列指针数组
    for (i=0; i<N; i++)
        InitQueue(qu[i]);       //初始化队列

    //为队列中加入值
    printf("输入若干正整数,以0结束: ");
    scanf("%d", &a);
    while(a)
    {
        enQueue(qu[a%10], a);
        scanf("%d", &a);
    }

    //输出各个队列
    printf("按个位数整理到各个队列中后,各队列出队的结果是: \n");
    for (i=0; i<N; i++)
    {
        printf("qu[%d]: ", i);
        while(!QueueEmpty(qu[i]))
        {
            deQueue(qu[i], a);
            printf("%d ", a);
        }
        printf("\n");
    }

    //销毁各个队列
    for (i=0; i<N; i++)
        DestroyQueue(qu[i]);
    return 0;
}


学习心得:链栈的应用。

<think>我们讨论的是SystemVerilog中的队列数组(array of queues)的使用方法。 队列数组是指数组的每个元素都是一个队列。例如:int q_array[3][$]; 表示一个包含3个队列数组,每个队列存储整数。 使用步骤: 1. 声明:指定数组大小和队列类型。 2. 初始化:可以分别初始化每个队列。 3. 操作:对每个队列进行独立的操作(push/pop/insert/delete等)。 示例: ``` 注意事项: - 数组索引和队列操作要分开进行。 - 每个队列都是独立的,可以有不同的长度。 下面通过示例代码详细说明:</think>在 SystemVerilog 中,队列数组(Array of Queues)是指数组的每个元素都是一个独立队列的数据结构。这种组合结构特别适用于需要分组管理动态数据的场景。以下是详细使用指南: ### 1. 声明与初始化 ```systemverilog // 声明包含3个整数队列数组 int queue_array[3][$]; // 初始化每个队列 initial begin queue_array[0] = {1, 2, 3}; // 索引0的队列 queue_array[1] = {10, 20}; // 索引1的队列 queue_array[2] = {}; // 索引2的空队列 end ``` ### 2. 基本操作 #### 添加元素 ```systemverilog // 向指定索引的队列添加元素 queue_array[0].push_back(4); // 队列0: {1,2,3,4} queue_array[1].push_front(5); // 队列1: {5,10,20} ``` #### 访问元素 ```systemverilog // 访问特定队列的元素 int first = queue_array[0][0]; // 获取队列0的第一个元素 (1) // 遍历所有队列 foreach(queue_array[i]) begin $write("Queue %0d: ", i); foreach(queue_array[i][j]) $write("%0d ", queue_array[i][j]); $display(""); end /* 输出: Queue 0: 1 2 3 4 Queue 1: 5 10 20 Queue 2: */ ``` ### 3. 高级操作 #### 动态添加队列 ```systemverilog // 动态扩展数组大小 int temp[][$] = new[4](queue_array); // 创建新数组并复制原内容 temp[3] = {100, 200}; // 初始化新队列 queue_array = temp; // 替换原数组 ``` #### 队列间数据转移 ```systemverilog // 将队列1的所有元素移到队列2 queue_array[2] = {queue_array[2], queue_array[1]}; // 合并 queue_array[1].delete(); // 清空队列1 ``` ### 4. 典型应用场景 #### 数据分组处理 ```systemverilog // 按奇偶性分组数字 int data[$] = {1,2,3,4,5,6,7,8,9}; int groups[2][$]; // 0:偶数, 1:奇数 foreach(data[i]) begin if(data[i] % 2 == 0) groups[0].push_back(data[i]); else groups[1].push_back(data[i]); end ``` #### 多通道数据缓冲 ```systemverilog // 创建4通道缓冲器 logic [7:0] channel_buf[4][$]; task write_channel(int ch, logic [7:0] data); channel_buf[ch].push_back(data); endtask task read_channel(int ch, output logic [7:0] data); if(channel_buf[ch].size() > 0) data = channel_buf[ch].pop_front(); else data = 8'hFF; // 空队列默认值 endtask ``` ### 5. 使用注意事项 | 事项 | 正确做法 | 错误示例 | |------|----------|----------| | 空队列检查 | `if(queue_array[i].size() > 0)` | 直接访问 `queue_array[i][0]` | | 数组边界 | `if(idx < queue_array.size())` | 访问 `queue_array[5]` (当size=4) | | 内存管理 | 手动清空不再使用的队列 | 保留废弃队列导致内存泄漏 | | 并发访问 | 使用信号量保护共享队列 | 多进程同时修改同一队列 | ### 性能优化技巧 1. **预分配空间**:减少动态扩展开销 ```systemverilog queue_array[0] = new[100]; // 预分配100个元素空间 ``` 2. **批量操作**:使用流操作符高效处理 ```systemverilog // 批量添加元素 queue_array[1] = {queue_array[1], {50,60,70}}; ``` 3. **引用访问**:避免大型队列复制 ```systemverilog function void process_queue(ref int q[$]); // 直接操作原队列 q.push_back(100); endfunction ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值