對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演算法!不錯,原理都是一樣的。呵呵