由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算法!不错,原理都是一样的。呵呵
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值