2010-12-13 46 views
1

在運行時,我想輸入兩種類型的數據類型,double和string。 其中一個條件是String應該以我輸入的順序彈出,而double會像通常的堆棧行爲LIFO一樣彈出。另一個條件是堆疊被限制爲最大尺寸10Stack問題:彈出一個模式

例如,一個運行實例

輸入Hello 1 World 2 blah blah 3 4 5

輸出Hello 5 World 4 blah blah 3 2 1

我的第一個問題是,有多少種方法是有沒有辦法解決這個問題? 我已經使用3個堆棧解決了這個問題,其中一個存儲double,一個存儲字符串,另一個用於反轉字符串順序。

我需要保存模式,以便程序知道雙打來自哪個順序,因此我將模式保存到字符串堆棧。由於堆棧的大小限制爲10,我需要以另一種方式保存圖案。

所以這是我的字符串堆棧將如何看起來像後推

  1. 你好*
  2. 世界*
  3. 等等
  4. 等等***

因此,在當第一次閱讀我需要在該堆棧位置進行特定的讀取,並將其從中提取出來。當我告訴程序下一個流行音樂是雙音節時,星號*留待以後使用。

我的第二個問題是,我想知道是否還有其他更優雅的解決方案來解決這個問題。由於我的解決方案將涉及一些字符串操作來解決這個問題。至於現在我實際上並沒有在字符串大小寫中使用pop函數,因爲它應該被使用。我用C++做了解決方案。

+0

通常的堆棧行爲,FIFO - 否,堆棧是LIFO,FIFO被稱爲「隊列」。 – 2010-12-13 20:13:28

+0

你是否必須使用堆棧或將其他結構做什麼? – casablanca 2010-12-13 20:13:56

+0

@imz:啊是的,真的我會編輯它 – starcorn 2010-12-13 20:17:04

回答

0

你在做什麼很好,除了如果你必須使用堆棧,那麼你不允許訪問堆棧中的隨機位置 - 你只能推/彈出 - 也不是所以很好地修改輸入字符串並在它們中存儲星號。

就可以解決這個使用推/彈出操作與5個堆棧(從技術上講,只有4將在任何時間使用,但因爲它們是不同類型的,你需要聲明在你的程序中的所有5) :

堆1:推加倍輸入順序

堆2:在輸入順序推串

堆3:推送數據類型在輸入順序(雙或字符串)

疊4:反向字符串的順序在堆2

堆5:在堆棧反向數據類型的順序3

現在,在一個時間從堆5彈出一個數據類型,如果它是一個雙,流行從堆棧1,否則從堆棧5彈出,並打印彈出的值。

編輯: @jleedev提出了一個很好的觀點,即在堆棧大小有限時沒有一個通用的解決方案。我上面所描述的假設你可以使用多個堆棧,並且每個堆棧可以容納與輸入中存在的項目一樣多的項目。

0

我會忽略堆棧大小的限制,因爲我認爲它的含義不清楚。另外,如果您可以使用多個堆棧(大小均爲10),則可以使用多個實際堆棧模擬較大的堆棧。

所以,這可以使用只有推/流行2堆棧。

  1. 推一切入堆棧A.

  2. 彈出一切從A到B.

  3. 如果B.empty返回

  4. 如果B.top是雙轉到7

  5. 輸出B.top並彈出B

  6. 轉到3

  7. 彈出所有B的到甲

  8. 而A.top爲不是雙彈出甲到乙

  9. 輸出A.top和彈出它關閉甲

  10. 轉到2.

+0

這可以很容易地修改爲使用3個堆棧,並且是O(n)而不是O(n^2) – 2010-12-14 00:31:12