簡體   English   中英

C ++組合隊列/堆棧的實現

[英]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元素緩沖區,並且必須在前面和后面添加元素。

為了在這樣的循環緩沖區中執行此操作,您需要知道哪個是第一個活動元素,哪個是最后一個 因此,您必須跟蹤兩個索引: startend 困難在於,連續的活動元素可以跨越緩沖區的邊界(即,起始元素的索引高於結束元素的索引。

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 ,如果它小於max0 ,如果它是恰好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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM