佇列是其元素以先進先出(fifo)的方式來處理集合,先入隊的元素會先讀取。
棧是和佇列非常類似的另乙個容器,棧和佇列最大的區別是後進先出(lifo),也可以說成先進後出。
佇列在現實生活中的例子數不勝數。例如:排隊打飯,排隊購買機票,列印佇列中等待處理的列印業務等
棧在生活中的例子也不少。例如:物流裝車,火車排程等
那麼,關於佇列和棧在c#的用法介紹如下:
佇列主要用法:
棧主要用法:
上述兩個圖中分別展示了佇列:queue及棧stack
而在實際的c#程式設計中,無論是queue還是stack都無法保證執行緒安全,換句話說,他們存在普通集合list存在的併發問題。關於這個問題,大家可以參考我的部落格:c# 集合-併發處理-鎖or執行緒
usingview codesystem;
using
system.collections.concurrent;
using
system.collections.generic;
using
system.linq;
using
system.text;
using
system.threading.tasks;
namespace
stackqueue
public
static
void rudui() //
定義乙個入隊方法 先進先出
; productqueue.enqueue(model);}}
public
static
void ruzhan() //
定義乙個入棧方法 先進後出
; productstack.push(model);}}
public
static
void ruduicc() //
保證執行緒安全的入隊方法
; productcq.enqueue(model);}}
public
static
void ruzhancc() //
保證執行緒安全的入棧方法
; productsk.push(model);}}
}public
class
product
public
string category
public
int sellprice }}
執行結果如下:
由此可見,queue入隊和stack入棧都存在併發的問題。
上述**中,提供了concurrentqueue和 concurrentstack兩種全新的佇列、棧。**注釋中也提到,這是netfrm4.0才提出的執行緒安全佇列及棧集合。
換句話說,使用concurrentqueue和 concurrentstack兩種全新的佇列、棧,無需考慮併發問題!
當然,如果您不習慣使用concurrentqueue和 concurrentstack,那麼您也可以結合c# lock(object) 進行**臨界,這種加鎖的方式也能解決queue和stack併發的問題。不過,加鎖就意味著額外開銷,效率會低一些。
加鎖的方式在我的部落格:c# 集合-併發處理-鎖or執行緒 中都有體現。
更多興趣閱讀《也是關於佇列應用的哦》:c# 定時器和佇列結合,賣包子啦,timer、 autoresetevent、 manualresetevent
當然,如果遍歷佇列或者棧,可以使用foreach(var a in ...)
今天只是做個整理,沒什麼特別的意義,有興趣的小虎斑點個讚吧!謝謝!
@陳臥龍的部落格
c 棧和佇列
c 棧 include using std stack s.empty 如果棧為空返回1,否則返回0 s.size 返回棧中元素的個數 s.pop 刪除棧頂元素但不返回其值 s.top 返回棧頂的元素,但不刪除該元素 s.push 在棧頂壓入新元素 測試例項 include include usin...
c 棧和佇列
使用標準庫的棧和佇列時,先包含相關的標頭檔案 include include 定義棧如下 stackstk 定義佇列如下 queueq 棧提供了如下的操作 cpp view plain copy s.empty 如果棧為空返回 true,否則返回 false s.size 返回棧中元素的個數 s.p...
C 棧和佇列
使用標準庫的棧和佇列時,先包含相關的標頭檔案 include include 定義棧如下 stackstk 定義佇列如下 queueq 棧提供了如下的操作 cpp view plain copy s.empty 如果棧為空返回 true 否則返回 false s.size 返回棧中元素的個數 s.p...