交换堆栈上的两个值

Swap two values on a stack

我想交换 std::stack<double> 顶部的两个值。有没有比以下方法更好的方法?

void swap_top(std::stack<double>& stack)
{
  double a = stack.top();
  stack.pop();
  double b = stack.top();
  stack.pop();
  stack.push(a);
  stack.push(b);
}

这几乎是标准的做法,将 "complex" 代码隔离到一个函数中,这样您就再也不用担心了。当然,作为模板函数会更好,这样它就不会绑定到 double 类型的堆栈。

或者,您可以子class 堆栈(真正的 is-a 子class 或 has-a 变体)并提供该功能作为额外功能。但是你 仍然 必须编写代码 以及 sub-classing 所需的所有代码:-)

你可以用更少的堆栈操作来做到这一点,但使用 std::swap,虽然我怀疑它会更快:

double a = stack.top();
stack.pop();
std::swap(a, stack.top());
stack.push(a);

或者干脆不使用stack,直接使用底层容器(如dequevectorlist)。

不知道是不是更好的方法,但至少是另一种方法

void swap_top(std::stack<double>& stack)
{
  double a = stack.top();
  stack.pop();

  swap( a, stack.top() ); 
  stack.push(a);
}

使用普通堆栈,没有更好的方法。

有趣的是,stack 适配器实际上将底层容器公开为受保护的成员。这意味着您可以这样做:

template <typename T, typename Container = std::deque<T>>
class stack_ex : public std::stack<T, Container> {
public:
  using stack_ex::stack::stack;
  void swap_top() {
    auto last = c.rbegin();
    auto before_last = std::prev(last);
    std::iter_swap(last, before_last);
  }
};

不,我会解释原因。

假设有一堆盘子,您只能看到最上面的那个。如果您要卸下顶板,则唯一可以接触到从顶部数第二个板的方法。现在考虑您已经移除了顶板。之前从顶部数第二个的盘子现在位于顶部。你如何修改这个盘子而不先从堆栈中提取它?这是不可能的,所以你提取它。在这一点上,交换元素的最快方法是简单地将它们放回原位,但顺序与提取它们的顺序相反。这就是你所拥有的。

你可以拿一个队列来做。

堆栈: 50 40 30 20 10

弹出前两个元素并插入队列中->->

Queue: 50 40 <- deueue 50 and 40 and oush to the stack 然后你会得到

堆栈 40 50 30 20 10