您的位置:首页 > 理论基础 > 数据结构算法

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

2011-11-13 12:04 253 查看
对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算法!不错,原理都是一样的。呵呵
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: