2011-12-23 19 views
2

我有一堆元素必須從中移除一個隨機元素(即,頂部和那個特定元素之間的所有元素將被彈出並再次被推送)。每當一個元素被彈出時,我們必須確定其它元素的彈出次數。如何計算特定項目從堆棧中彈出的次數?

我很久以前就已經開始這個了。 (堆棧是動態的(即元素不時被添加和刪除))。

回答

1

我會在堆棧存儲爲一個單鏈接列表,並在每個節點中保留一個整數以表示它被訪問的次數。即,5底部頂部,7堆棧並沒有做出看起來像訪問:

| 5 | -> | 2 | -> | 3 | -> | 1 | -> | 7 | 
| 0 | -> | 0 | -> | 0 | -> | 0 | -> | 0 | 

然後,你可以寫自己的流行音樂(O(N)),它只是通過鏈接列表中添加1迭代訪問它訪問的每個節點的計數(如果你可以假設你彈出的東西總是在堆棧中,那麼你只需要遍歷它一次,如果不是,你可能需要迭代兩次),pop(3): //返回0

| 5 | -> | 2 | -> | 1 | -> | 7 | 
| 1 | -> | 1 | -> | 0 | -> | 0 | 

POP(7)://返回0

| 5 | -> | 2 | -> | 1 | 
| 2 | -> | 2 | -> | 1 | 

POP(2)://返回2

| 5 | -> | 1 | 
| 3 | -> | 1 | 

推(6):

| 6 | -> | 5 | -> | 1 | 
| 0 | -> | 3 | -> | 1 | 

POP(1)://返回1

| 6 | -> | 5 | 
| 1 | -> | 4 | 

彈出(6 )://返回1

| 5 | 
| 4 | 

流行(5)://返回4

+0

這是非常有用的,但問題是這個問題是在我的書中被問到當堆棧被實現爲使用數組的結構時。 – 2011-12-23 21:26:44

2

如果我正確理解你,你有自己的堆棧結構,並且你想要計算特定元素的推動和彈出。如果是這樣的話,你可以在一個struct包裝你的數據,並在堆棧商店列表(無論內部執行堆棧的是)這個struct

struct stack_data { 
    unsigned push_count; 
    unsigned pop_count; 
    void *data; /* or whatever type the data is */ 
}; 

... 

void stack_push(/* stack argument */, struct stack_data *data) 
{ 
    ... 
    data->push_count++; 
} 

void stack_pop(/* stack argument */, struct stack_data *data) 
{ 
    ... 
    data->pop_count++; 
} 
+0

如果你知道堆棧上的物品的數量,你將不需要這兩種物品:) – Pedery 2011-12-23 21:26:44

+0

@Pedery,但數字不斷變化。我一直在想,如果我能存儲該特定元素的初始位置,然後當它彈出時,我可以將其從最終位置中減去。但是我似乎無法理解它。如果您瞭解了此代碼的概念,請解釋一下。 – 2011-12-23 21:30:00

+0

我的觀點是,你不會需要*既* pop_count和push_count。只需要其中一個。流行音樂,推送和堆棧大小都是連接的。如果pop_count是50並且堆棧大小是10,那麼顯然推式計數必須是60.因爲你的意圖是將不同的物品放在堆棧上,所以你需要知道堆棧包含的物品的數量,所以概念本質上是一樣的。 – Pedery 2011-12-23 21:36:46