学习记录——递归和堆栈

来源:互联网 发布:英雄联盟 魔兽世界知乎 编辑:程序博客网 时间:2024/05/27 21:49
       今天在学习递归和堆栈的知识[1]中,使用堆栈进行求和运算过程中遇到了"deque iterator not dereferencable"问题:

#include "stdafx.h"#include <iostream>#include <stack>using namespace std;


递归求和函数:
int sum1(int value){if (value==1)return 1;elsereturn 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 0
原创粉丝点击