由windows的Alt+Tab鍵聯想到的資料結構

來源:互聯網
上載者:User

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.