循环的目的是通过两个同时进行比较的堆栈,并放入临时堆栈(c和d),同时弹出其余堆栈,但这会给我分段错误。我还在学习c ++,而段错误是我最大的问题。
while((a.top()==b.top())&&(!a.empty())&&(!b.empty())){
e=a.top();
f=b.top();
a.pop();
b.pop();
c.push(e);
d.push(f);
}
编辑:a和b是两个先前已定义并将相互比较的堆栈。
c和d是临时堆栈,它们会在弹出时保存a和b的数据,
e和f是a和b中项目放置在c和d中的值占位符。
答案 0 :(得分:2)
while(!(a.empty() || b.empty())
&& (a.top() == b.top()))
{
e=a.top();
f=b.top();
a.pop();
b.pop();
c.push(e);
d.push(f);
}
记下测试的顺序。如果任一容器为空,您的代码将显示未定义的行为。测试的顺序很重要,因为对&&amp ;;的第二个操作数的评估。如果第一个评估为false,则不会被评估。
编辑:
我对循环中的副本数量感到有点困扰(是的,我也想找到过早优化程序的方法:-))。
根据您的堆栈中匹配项的数量,您可能会获得更好的性能(c ++ 11或更高版本):
while(!(a.empty() || b.empty())
&& (a.top() == b.top()))
{
c.push(std::move(a.top())); // move the top item of a to the top of c
a.pop(); // destroy the shrivelled husk of what used to be
// at the top of a.
d.push(std::move(b.top()));
b.pop();
}
答案 1 :(得分:1)
很难说没有模式代码,但假设这些是std::stack
个对象,您可能需要检查它们是否为空之前在它们上面调用top
变化
while((a.top()==b.top())&&(!a.empty())&&(!b.empty())){
到
while((!a.empty())&&(!b.empty())&&(a.top()==b.top())){
top
返回一个引用,但如果堆栈上什么都没有,那么那将是什么?这将导致未定义的行为。 >强调top
之后,没有必要检查空虚。通过这种方式更改订单,如果其中一个(或两个)为空,您肯定不会在top
或a
上调用b
。
假设此链接http://www.cplusplus.com/reference/stack/stack/top/中的信息是正确的,那么它表明top
在底层容器上调用back
,这肯定会导致一些未定义的行为(如果不是所有的容器都是空的。