我想交换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);
}
答案 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
,直接使用底层容器(例如deque
,vector
或list
)。
答案 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