当前位置: 首页 > news >正文

由windows的Alt+Tab键联想到的数据结构

对windows的快捷键比较熟悉的人应该用过Alt+Tab吧。可以方便的切换各个任务程序。在win7下的效果更炫一点。按住Alt键不放,然后敲击Tab键,即可预览各个任务界面,以及切换到各个程序界面。那么这是如何实现的后台数据结构是如何设计的。

首先应该认真观察切换效果,假设有任务A,B,C,D,E。
(1)切换一次后变成B,A,C,D,E.在切换一次后又是A,B,C,D,E。
(2)切换两次后变成C,A,B,D,E.三次后变成D,A,B,C,E.
(3)切换五次后仍为A,B,C,D,E.
(4)切换七次后是C,A,B,D,E.

分析后发现其实就是一个特殊栈,栈顶是当前界面,然后从栈顶往下遍历(还可以循环上来),到哪个把哪个抽出来放到栈顶,作为当前界面。
由于涉及增删较多,数据结构可以选用链式存储,遍历到想要的节点,摘下放到头结点即可。由于切换循环,当然需要循环链表了。另外每开一个新的程序需要放到头结点。代码如下,大家只需关注核心两个函数就可以了。其余都是为了测试用的。
#include<iostream> using namespace std; struct Node{ int data; Node* next; }; class Task{ public: Task(int data){ Node* node = new Node; node->data = data; node->next = node; used = node; now = node; last = node; } void open(int data){ Node* node = new Node; node->data = data; node->next = used; last->next = node; used = node; now = used; } /*核心*/ void press(){ //摁下Alt放得前提下,摁Tab键一次 pre = now; now = now->next; } void up(){ //放下Alt和Tab键 if(now == used){ } else if(now == last){ used = last; last = pre; now = used; }else{ pre->next = now->next; now->next = used; last->next = now; used = now; } }/*核心*/ void out(){ Node* p = used; cout << p->data << " "; while(p->next != used){ p = p->next; cout << p->data << " "; } cout << endl; } private: Node* used; Node* now; Node* pre; Node* last; }; int main(){ int count = 5; Task task(1); while(count--){ task.open(count); task.out(); } for(int j = 1; j < 10; j++){ for(int k = 0; k < j; k++){ task.press(); } task.up(); task.out(); } return 0; }
看完之后是否会感觉这个就像是操作系统中学到的内存LRU算法!不错,原理都是一样的。呵呵

相关文章:

  • 原生js解决简单轮播图的切换
  • MDCC印象之二:芒果的味道
  • ORA-00600: internal error code, arguments: [kgl-no-mutex-held]
  • exp之compress到底在压缩什么
  • 数据库的独立子查询以及数据的删除、更新和建立视图的笔记
  • 让每次弹出的div随页面的卷动而保持相对位置不变
  • 课后作业-阅读任务-阅读笔记-4
  • connect by level语法的理解
  • echarts 重新渲染(重新绘制,重新加载数据)等
  • 【转】如何恶搞朋友的电脑?超简单的vbs代码
  • 如何访问dashed filename
  • 超简洁的jquery操作页面中iframe内的dom元素
  • maven使用阿里镜像配置文件
  • 办理护照
  • h5混合开发好用的下拉刷新插件
  • Angular 响应式表单 基础例子
  • chrome扩展demo1-小时钟
  • JavaScript服务器推送技术之 WebSocket
  • javascript面向对象之创建对象
  • Koa2 之文件上传下载
  • linux安装openssl、swoole等扩展的具体步骤
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • oschina
  • 技术发展面试
  • 聚簇索引和非聚簇索引
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 浅谈web中前端模板引擎的使用
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • # 透过事物看本质的能力怎么培养?
  • (1)(1.11) SiK Radio v2(一)
  • (bean配置类的注解开发)学习Spring的第十三天
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • .bat批处理出现中文乱码的情况
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .Net的DataSet直接与SQL2005交互
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • [2010-8-30]
  • [BUUCTF 2018]Online Tool(特详解)
  • [C++从入门到精通] 14.虚函数、纯虚函数和虚析构(virtual)
  • [CDOJ 838]母仪天下 【线段树手速练习 15分钟内敲完算合格】
  • [C语言][PTA基础C基础题目集] strtok 函数的理解与应用
  • [DL]深度学习_Feature Pyramid Network
  • [HCTF 2018]WarmUp (代码审计)
  • [IE编程] IE中对网页进行截图的编程接口
  • [math]判断线段是否相交及夹角
  • [svc]NFS存储企业场景及nfs最佳实战探究
  • [uniapp生命周期]详细讲解uniapp中那些属于vue生命周期,那些属于uniapp独有的生命周期,以及这中间的区别 相关的内容和api 代码注释
  • [WeChall] Training: GPG Write Up 解决方法