學習記錄——遞歸和堆棧

       今天在學習遞歸和堆棧的知識[1]中,使用堆棧進行求和運算過程中遇到了"deque iterator not dereferencable"問題:

#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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章