#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