特殊的線性結構 佇列

2021-06-20 17:57:42 字數 3564 閱讀 2540

佇列也是一種線性結構。有著先進先出的特性。如圖

很顯然佇列內部的儲存結構也是線性表或者鍊錶。好現在考慮線性表,假如用陣列存,入隊非常簡單就是在陣列的後面賦值就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 模擬佇列的資料結構 佇列的特點是先進先出,元素只能從佇列的尾部新增,從佇列的頭部出隊。模擬...