[英]c++ Implementation of a combined queue/stack
對於我最新的作業,我應該實現一個“ quack”,它是循環隊列和堆棧的組合。 現在,我正在嘗試將頭兩個功能pushFront和pushBack包裹起來。 這是它們如何工作的示例。
pushFront(a)[a -----]
pushFront(b)[a ---- b]
相反,如果首先調用pushBack,則需要將該項放置在數組的第一個元素中,然后再移回。
pushBack(a)[a -----]
pushBack(b)[ab ----]
這是我很困惑的地方:
1.)使用取模算法將前部從item [0]包裝到item [max -1]。 我能想到的唯一解決方案是創建一個if語句,當到達[0]時將其移至[max-1]。
2.)為了使pushBack函數將值放置在item [0]中,它必須從item [max-1]開始(然后在放置該項之前“向后”移動)。 問題是,如果首先調用pushFront,則該位置已經有一個項目。
3.)我考慮過使用while(item [back]!= null)來移動它,但是我稍后要寫的pop函數似乎並沒有真正從數組中刪除項目。 取而代之的是,它們只是移動前后位置,實際上是縮短了嘎嘎聲。 非常感謝您的幫助,如果您出於任何原因希望查看代碼,請告訴我。 因為我的問題更具概念性,所以我認為這可能是解決問題的最佳方法。
我相信函數pushFront應該將下一個字符推入列表的前面。 所以代替
pushFront(a)[a -----]
pushFront(b)[a ---- b]
你應該得到
pushFront(a)[a -----]
pushFront(b)[ba ----]
pushFront(c)[cba ---]
pushBack(d)[cbad--]
無論哪種方式,您都不需要使用模運算符,直到需要找到正面和背面。
您的架構有些混亂。 從您的解釋中我們了解到,您具有固定大小的max
元素緩沖區,並且必須在前面和后面添加元素。
為了在這樣的循環緩沖區中執行此操作,您需要知道哪個是第一個活動元素,哪個是最后一個 。 因此,您必須跟蹤兩個索引: start
和end
。 困難在於,連續的活動元素可以跨越緩沖區的邊界(即,起始元素的索引高於結束元素的索引。
empty:
+----+----+----+----+
! ! ! ! ! start=0, end=0
---------------------
pushback(a):
+----+----+----+----+
! a ! ! ! ! start=0, end=1
---------------------
pushback(b):
+----+----+----+----+
! a ! b ! ! ! start=0, end=2
---------------------
pushfront(c):
+----+----+----+----+
! a ! b ! ! c ! start=max-1, end=2
---------------------
after a log of push and pop front and back :
+----+----+----+----+
! ! x ! y ! z ! start=1, end=0
---------------------
1)為了巧妙地規避這些情況,模運算有助於:
(end + 1) % max
效果在end+1
,如果它小於max
或0
,如果它是恰好max
。 模運算符%
對於管理一種循環算術非常實用。
2)考慮到這種觀點,您的后退操作是(偽代碼):
check that buffer is not full
add the element at end index and increment the index as explained in 1.
從某種意義上說,pushfront是類似的,您必須在開始時或在開始之前添加一個元素(取決於結構是否為empy或是否已經有元素),然后遞減開始(因此,一個小技巧:使用無符號整數類型,例如size_t表示)您的索引,以便在從0開始遞減時能夠使用模數。
您還具有堆棧操作這一事實意味着您
3)考慮到這種邏輯,3不再是問題。
4)但是,您需要考慮一個未解決的問題:
遵循此邏輯時,開始時您將end == start都設為0。當您的結構已滿時,請再次開始end == start,因此您必須考慮如何處理此問題。 產生差異的最簡單方法是對元素進行計數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.