#include "stdafx.h"
#include <iostream>
#include <stack>
using namespace std;
递归求和函数:
int sum1(int value)
{
if (value==1)
return 1;
else
return value+sum1(value-1);
}
int sum2(int value)
{
stack<int> val;
int count = 0 ;
int number = 0;
while(value>0){
val.push(value);
value--;
}
while(0!=(number=val.top()))
{
count+=number;
cout<<number<<endl;
val.pop();
}
return count;
}
主函数:
int _tmain(int argc, _TCHAR* argv[])
{
int num1 = sum1(6);
int num2 = sum2(6);
cout<<"result = "<<num1<<endl
<<num2 <<endl;
return 0;
}
运行结果出错:
经检查发现是在使用堆栈进行求和运算过程中遇到了"deque iterator not dereferencable"问题;
通过查找资料[2],发现原因是在栈容器中访问了某一个不存在的位置(注:此处问题也可以延伸到其他有相关push、pop操作的容器中)
检查sum2函数发现:标红处执行了不恰当的访问操作。当stack容器中的元素都pop完后,程序依旧去执行了while中的条件语句,此时已不存在返回的val.top数据。
为此,要怎样避免访问到不存在的位置呢?修改sum2函数如下:
int sum2(int value)
{
//先将所有元素压入栈后,在弹出每个元素的过程中求和
stack<int> val;
int count = 0 ;
</span> while(value!=0){
val.push(value); // 例如压入 6 5 4 3 2 1
value--;
}
while( !val.empty())
{
count+=val.top(); //求和
cout<< val.top()<<endl; //弹出 1 2 3 4 5 6
val.pop();
}
return count;
}
此处通过val.empty()作为条件语句,避免了访问不存在的位置。也可以修改为:
int sum2(int value)
{
stack<int> val;
int count = 0 ;
int number = 0;
// 每次压入一个数值后,随即弹出 加入到求和操作,直至不再压入数值
val.push(value);
while(0!=(number=val.top()))
{
val.pop();
count+=number;
cout<<number<<endl;
val.push(number-1);
}
return count;
}
感谢以下相关参考来源:
【1】http://blog.csdn.net/feixiaoxing/article/details/6838773
【2】http://blog.csdn.net/midle110/article/details/8238581