我有一堆元素,必须从中移除随机元素(即顶部和特定元素之间的所有元素将被弹出并再次推送)。每次弹出一个元素时,我们必须确定之前为其他元素弹出的次数。
我已经有很长一段时间了。 (堆栈是动态的(即不时添加和删除元素))。
答案 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