佇列也是一種線性結構。有著先進先出的特性。如圖
很顯然佇列內部的儲存結構也是線性表或者鍊錶。好現在考慮線性表,假如用陣列存,入隊非常簡單就是在陣列的後面賦值就ok了,但是出隊就出現問題了,比如a元素進隊 在陣列中是a[0]存的現在要出隊的資料根據佇列先進先出的特性,我們現在要取出a[0],可以很顯然直接砍掉陣列的前面的元素是不可能的如果呼叫array.copy或者寫個演算法迴圈移位的話就存在o(n)的時間複雜度,可是很顯然僅僅是乙個出隊的操作,如果有o(n)的時間複雜度是不划算的所以我們採取了一種策略。
設定乙個頭索引front和乙個尾索引rear。入隊就讓rear後移,出隊就取出front 然後後移,可以這裡又存在乙個問題了如果front後移了front前面的空間不是浪費了麼?所以這裡我們又得採取一種策略那就是迴圈佇列。簡單點說rear到達maxsize的時候 再前移就是回到了0 如圖
這樣簡單點說只需要讓front不斷的後移動知道它移動到rear就全部出隊了 佇列就是空的了或者說設定乙個count出隊就+1出隊就-1 count == 0佇列就是空的看你怎麼理解了
**如下:
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
namespace 棧佇列
}//我們把佇列設定成動態增長的
t nums;
//初始化內部陣列
public myqueue()
public myqueue(t items):this()
}/// /// 入隊
///
///
public void enqueue(t elem)
nums[rear] = elem;
//為了保險怕rear超過maxsize
rear = (rear + 1) % maxsize;
count++;
}/// /// 出隊並且返回對首元素
///
///
public t dequeue()
t data = nums[front];
//重新設定佇列起始位置,迴圈佇列
front = (front + 1) % maxsize;
count--;
return data;
}/// /// 返回隊首的物件但是不將其移除
///
///
public t peek()
return nums[front];
}/// /// 佇列的顯示
///
///
public override string tostring()
return sb.tostring();}}
}
.net框架的原始碼也是使用的這種迴圈佇列的方式
上篇的棧我沒有用鍊錶這次的佇列 我也就用鍊錶實現了一下佇列 鏈式佇列有個好處出隊的時候砍下隊頭 只需要設定佇列頭節點的鏈式關係就ok了 不需要調array.copy或者迴圈移位鏈式佇列**如下:
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
namespace 鏈式佇列
}public myqueue()
public myqueue(t nums)
: this()
}/// /// 入隊
///
///
public void enqueue(t elem)
qnodeq = new qnode();
q.data = elem;
if (front == null)
rear.next = q;
rear = q;
count++;
}/// /// 出隊並返回隊首元素
///
///
public t dequeue()
qnodeq = new qnode();
//取得隊首元素
q = front.next;
//獲取隊首元素的值
t data = q.data;
//重新設定鍊錶關係 此時原來q的原來的引用front.next重新指向隊首 q會被gc**
front.next = q.next;
count--;
return data;
}/// /// 取出佇列首元素,但是首元素不出佇列
///
///
public t peek()
public override string tostring()
return sb.tostring();}}
}
測試**如下:
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
namespace 鏈式佇列
console.writeline("將測試陣列入隊");
myqueuequeue = new myqueue(nums);
console.writeline("輸出佇列");
console.writeline(queue.tostring());
console.writeline("將首元素出隊並顯示");
console.writeline(queue.peek());
console.writeline("將首元素移除並顯示佇列");
queue.dequeue();
console.writeline(queue.tostring());
console.writeline("輸出佇列長度");
console.writeline(queue.count);
console.writeline("再次入隊999");
queue.enqueue(999);
console.writeline("顯示佇列");
console.writeline(queue.tostring());
console.read();}}
}
結果如圖:
特殊的線性表 佇列
鏈隊允許在表的一端進行插入,而在表的另一端進行刪除。隊頭 允許刪除的一端。隊尾 允許插入的一端。訪問原則 先進先出fifo 置空隊setnull q 將佇列q置成空佇列。入隊push q,x 將元素x插入到佇列q的隊尾。出隊pop q 刪除佇列q的隊頭元素。取隊頭元素gettop q 返回佇列q的隊...
線性結構 佇列
佇列 銀行業務佇列簡單模擬 25分 設某銀行有a b兩個業務視窗,且處理業務的速度不一樣,其中a視窗處理速度是b視窗的2倍 即當a視窗每處理完2個顧客時,b視窗處理完1個顧客。給定到達銀行的顧客序列,請按業務完成的順序輸出顧客序列。假定不考慮顧客先後到達的時間間隔,並且當不同視窗同時處理完2個顧客時...
線性結構 佇列
1.佇列 queue 理解佇列,可以參考實際生活中的排隊,排隊的人只能從隊尾加入,從隊首出隊,這也是佇列的特點。即只能從隊尾新增元素,從隊首刪除元素,這也是常說的先進先出 first in first out 模擬佇列的資料結構 佇列的特點是先進先出,元素只能從佇列的尾部新增,從佇列的頭部出隊。模擬...