学习记录——递归和堆栈

       今天在学习递归和堆栈的知识[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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值