如何计算特定项目从堆栈中弹出的次数?

时间:2011-12-23 20:53:46

标签: c algorithm data-structures

我有一堆元素,必须从中移除随机元素(即顶部和特定元素之间的所有元素将被弹出并再次推送)。每次弹出一个元素时,我们必须确定之前为其他元素弹出的次数。

我已经有很长一段时间了。 (堆栈是动态的(即不时添加和删除元素))。

2 个答案:

答案 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++;
}

答案 1 :(得分:1)

我将堆栈存储为单链表,并在每个节点中保留一个整数来表示它被访问的次数。 IE,一个堆栈顶部有5个,底部有7个没有访问,看起来像是:

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

然后你可以编写自己的pop(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 |

pop(6)://返回1

| 5 |
| 4 |

pop(5)://返回4