2011-12-23 4 views
2

私は、ランダムな要素を削除する必要がある要素のスタックを持っています(つまり、その要素とその特定の要素の間にあるすべての要素がポップされ、再度プッシュされます)。そして、要素がポップされるたびに、他の要素に対して先にポップされた回数を判断する必要があります。特定のアイテムがスタックからポップされた回数をどのように数えることが可能ですか?

私は長い間このことを続けてきました。 (スタックは動的です(つまり、要素は時々追加され、削除されます))。

答えて

1

を単独でリンクされて、私はスタックを格納します各ノードには、アクセスされた回数を表す整数を保持します。リンクリストをただ繰り返し処理は、1を追加する次に、あなたがあなた自身のポップ(O(n)を)書くことができる

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

:IE、上に5とスタック、7底にして作られた全くのアクセスは次のようになりませんでしょう訪問した各ノードの数にアクセスする(ポップするものは常にスタック内にあると仮定できる場合は、一度反復する必要がありますが、そうでなければ2回反復する必要があります)。 // 0

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

ポップ(7)戻り値://が0

| 5 | -> | 2 | -> | 1 | 
| 2 | -> | 2 | -> | 1 | 
を返します。

(2)POP:// 2

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

プッシュ(6)戻り値:

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

ポップ(1):// 1つの

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

ポップを返す(6 )://返品1

| 5 | 
| 4 | 

3 pop(5):// Returns 4

+0

これは非常に役に立ちますが、スタックを配列を使って構造体として実装しているときに、この質問が私の本で尋ねられるという問題があります。 –

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

+0

@Pederyでも番号は変更され続けます。その特定の要素の最初の位置を格納し、ポップされるときに私は最終位置からそれを引き出すことができます。しかし、私はそれについて行くことはできません。そして、このコードの概念を理解していれば、説明してください。 –

+0

私のポイントは、単純に、あなたが* pop_countとpush_countの両方を必要としないことでした。そのうちの1つだけが必要です。ポップ、プッシュ、スタックサイズはすべて接続されています。 pop_countが50、スタックサイズが10の場合、プッシュカウントは60でなければなりません。スタック上に異なるアイテムを保持することが意図されているので、スタックに含まれるアイテムの数を知る必要があります。概念は基本的に同じです。 – Pedery

関連する問題