IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> uva210 循环链表+队列+索引=>模拟 -> 正文阅读

[数据结构与算法]uva210 循环链表+队列+索引=>模拟

uva210

  • 程序循环进行 : 循环链表
  • Lock未遂的程序依次抓走 : 队列
  • 数据结构刚好看到循环链表,感觉写好了插入删除很方便
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <string>
#include <cstring>

using namespace std;
struct Node;

#define TEST 1

typedef Node *pNode;
typedef queue<string> Program;

struct Node
{
    Node(int k, pNode p = NULL) : n(k), next(p) {}
    int n;
    pNode next;
};

//创建n个节点,第 i 个的值是 i - 1, 返回头节点地址
pNode Create(int n)
{
    pNode ret = new Node(-1);
    pNode cur = ret;
    for (int i = 0; i != n; ++i)
    {
        cur->next = new Node(i);
        cur = cur->next;
    }
    cur->next = ret;
    return ret;
}

//删除d节点,返回d节点前边的节点,这个在后边很有用
pNode del(pNode h, pNode d)
{
    while (h->next != d)
        h = h->next;
    h->next = d->next;
    delete d;
    return h;
}

//在队列中取出一个放到curr后边
void toback2(pNode curr, queue<int> &iq)
{
    curr->next = new Node(iq.front(), curr->next);
    iq.pop();
}

void run(ostream &);

int Q;                          //每个程序运行最大时长
int Time[5];                    //5个命令各自用时
int v[26];                      //26个变量
int pro_cnt;                    //程序数
bool LOCK;                      //是否Locking
vector<Program> Kase;           //每一个Program对应一个程序,每执行一行对应pop一行

int main()
{
    ofstream ofs;

    if (TEST)
    {
        ofs.open("/home/lixiaoqi/Documents/Code/C++/1.txt");
        if (!ofs.is_open())
            throw runtime_error("FILE NOT OPEN!");
    }
    ostream &os = TEST ? ofs : cout;

    int N;
    string s;

    cin >> N;
    getchar();
    while (N--)
    {
        Kase.clear();
        LOCK = false;
        memset(v, 0, sizeof v);

        cin >> pro_cnt;
        for (int i = 0; i != 5; ++i)
            cin >> Time[i];
        cin >> Q;

        Kase.resize(pro_cnt);

        getchar();
        for (int i = 0; i != pro_cnt; ++i)
            while (getline(cin, s) && s != "end")
                Kase[i].push(s);

        run(os);
        os << (N ? "\n" : "");
    }

    return 0;
}

void run(ostream &os)
{
    queue<int> block;                           //LOCK未遂的那些
    pNode h = Create(pro_cnt);
    pNode cur = h;

    /*每一个程序执行完,都要在循环链表中走一步,遇见头节点再走一步
     *在程序执行时,用left代表剩余时间控制循环,同时还要注意对应这个程序是否已经finish
     *程序全部执行完,要即时在链表中删除
     */
    while (h->next != h)
    {
        if (cur == h)
            cur = cur->next;
        int left = Q;
        int i = cur->n;

        while (Kase[i].size() && left > 0)
        {
            string s = Kase[i].front();

            if (s == "lock")
            {
                if (!LOCK)
                {
                    left -= Time[2];
                    LOCK = true;
                }
                else
                {
                    block.push(i);
                    cur = del(h, cur);
                    break;
                }
            }
            else if (s == "unlock")
            {
                if (block.size())
                    toback2(cur, block);
                LOCK = false;
                left -= Time[3];
            }
            else if (s[0] == 'p' && s[1] == 'r')
            {
                os << i + 1 << ": " << v[s[6] - 'a'] << '\n';
                left -= Time[1];
            }
            else
            {
                int k = 0;
                for (int j = 4; j != s.size(); ++j)
                    k = k * 10 + s[j] - '0';
                v[s[0] - 'a'] = k;
                left -= Time[0];
            }

            Kase[i].pop();
        }

        if (Kase[i].empty())
            cur = del(h, cur);

        cur = cur->next;
    }
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-08 10:59:23  更:2021-09-08 11:01:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/30 1:18:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码