第七周项目四__队列数组

本文介绍了一个使用队列和数组结合的应用实例,通过定义队列指针数组实现对输入的正整数按个位数进行分类存储,并展示了完整的C++代码实现及运行结果。
/*
烟台大学计算机学院

文件名称:main.cpp ti.cpp head.cpp

作者:王硕

完成日期:2017年10月16日

问题描述:第七周项目四
队列数组

输入描述:

输出描述:

*/
#include <iostream>
#include <stdio.h>
#include <malloc.h>
#include "head.h"
using namespace std;
#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;

}
//head.h

#ifndef LIST_H_INCLUDED
#define LIST_H_INCLUDED

#define MaxSize 5
typedef int ElemType;
typedef struct qnode
{
    ElemType data;
    struct qnode *next;
} QNode;        //链队数据结点类型定义

typedef struct
{
    QNode *front;
    QNode *rear;
} LiQueue;          //链队类型定义
void InitQueue(LiQueue *&q);  //初始化链队
void DestroyQueue(LiQueue *&q);  //销毁链队
bool QueueEmpty(LiQueue *q);  //判断链队是否为空
int QueueLength(LiQueue *q);  //返回队列中数据元素个数
void enQueue(LiQueue *&q,ElemType e);  //入队
bool deQueue(LiQueue *&q,ElemType &e);   //出队

#endif


//ti.cpp

#include <stdio.h>
#include <malloc.h>
#include "head.h"

void InitQueue(LiQueue *&q)  //初始化链队
{
    q=(LiQueue *)malloc(sizeof(LiQueue));
    q->front=q->rear=NULL;
}
void DestroyQueue(LiQueue *&q)  //销毁链队
{
    QNode *p=q->front,*r;   //p指向队头数据节点
    if (p!=NULL)            //释放数据节点占用空间
    {
        r=p->next;
        while (r!=NULL)
        {
            free(p);
            p=r;
            r=p->next;
        }
    }
    free(p);
    free(q);                //释放链队节点占用空间
}
bool QueueEmpty(LiQueue *q)  //判断链队是否为空
{
    return(q->rear==NULL);
}
int QueueLength(LiQueue *q)  //返回队列中数据元素个数
{
    int n=0;
    QNode *p=q->front;
    while (p!=NULL)
    {
        n++;
        p=p->next;
    }
    return(n);
}
void enQueue(LiQueue *&q,ElemType e)  //入队
{
    QNode *p;
    p=(QNode *)malloc(sizeof(QNode));
    p->data=e;
    p->next=NULL;
    if (q->rear==NULL)      //若链队为空,则新节点是队首节点又是队尾节点
        q->front=q->rear=p;
    else
    {
        q->rear->next=p;    //将*p节点链到队尾,并将rear指向它
        q->rear=p;
    }
}
bool deQueue(LiQueue *&q,ElemType &e)   //出队
{
    QNode *t;
    if (q->rear==NULL)      //队列为空
        return false;
    t=q->front;             //t指向第一个数据节点
    if (q->front==q->rear)  //队列中只有一个节点时
        q->front=q->rear=NULL;
    else                    //队列中有多个节点时
        q->front=q->front->next;
    e=t->data;
    free(t);
    return true;
}



运行结果:




知识点总结:

这是队列和数组的一种结合

学习心得:

理解代码时要细心

【顶级EI完整复现】【DRCC】考虑N-1准则的分布鲁棒机会约束低碳经济调度(Matlab代码实现)内容概要:本文介绍了名为《【顶级EI完整复现】【DRCC】考虑N-1准则的分布鲁棒机会约束低碳经济调度(Matlab代码实现)》的技术资源,聚焦于电力系统中低碳经济调度问题,结合N-1安全准则与分布鲁棒机会约束(DRCC)方法,提升调度模型在不确定性环境下的鲁棒性和可行性。该资源提供了完整的Matlab代码实现,涵盖建模、优化求解及仿真分析全过程,适用于复杂电力系统调度场景的科研复现与算法验证。文中还列举了大量相关领域的研究主题与代码资源,涉及智能优化算法、机器学习、电力系统管理、路径规划等多个方向,展示了广泛的科研应用支持能力。; 适合人群:具备一定电力系统、优化理论和Matlab编程基础的研究生、科研人员及从事能源调度、智能电网相关工作的工程师。; 使用场景及目标:①复现高水平期刊(如EI/SCI)关于低碳经济调度的研究成果;②深入理解N-1安全约束与分布鲁棒优化在电力调度中的建模方法;③开展含新能源接入的电力系统不确定性优化研究;④为科研项目、论文撰写或工程应用提供可运行的算法原型和技术支撑。; 阅读建议:建议读者结合文档提供的网盘资源,下载完整代码与案例数据,按照目录顺序逐步学习,并重点理解DRCC建模思想与Matlab/YALMIP/CPLEX等工具的集成使用方式,同时可参考文中列出的同类研究方向拓展研究思路。
<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 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值