在堆栈上交换两个值

时间:2015-04-17 08:32:11

标签: c++ stack swap

我想交换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);
}

6 个答案:

答案 0 :(得分:11)

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

有趣的是,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);
  }
};

答案 1 :(得分:5)

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

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

或者只是不使用stack,直接使用底层容器(例如dequevectorlist)。

答案 2 :(得分:2)

这几乎是标准的做法,隔离了&#34;复杂&#34;代码到函数,所以你再也不用担心它了。当然,作为模板函数会更好,因此它不会与double类型的堆栈绑定。

或者,您可以对堆栈进行子类化(实际的is-a子类或has-a变体)并将该功能作为额外提供。但是,你必须编写代码以及子类化所需的所有代码: - )

答案 3 :(得分:1)

我不知道这是否是一种更好的方式,但至少它是另一种方式。

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

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

答案 4 :(得分:0)

不,我会解释原因。

想象一下,有一堆盘子,你只能看到顶部的盘子。如果要卸下顶板,唯一可以从顶部进入底板的方法就是这样。现在考虑你已经移除了顶板。先前从顶部第二个的板现在位于顶部。如何在不首先将其从堆栈中提取的情况下修改此板?这是不可能的,所以你提取它。在这一点上,交换元素的最快方法是简单地将它们放回去,但是以与它们被提取的相反顺序。这就是你拥有的。

答案 5 :(得分:-1)

你可以拿一个队列来做。

堆栈: 50 40 三十 20 10

在队列中弹出前两个元素和inser - &gt; - &gt;

队列:50 40&lt; - deueue 50 and 40和oush到堆栈然后你会得到

栈 40 50 三十 20 10