| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
跟大牛学C++学算法数据结构
共有 195 人关注过本帖
标题:求大神帮看看是啥情况,关于stack overflow
只看楼主 加入收藏
阿斯顿7756
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2018-2-8
结帖率:66.67%
  已结贴   问题点数:20  回复次数:2   
求大神帮看看是啥情况,关于stack overflow
做的是从一个数据文件里读取几万条商品购买记录,然后对商品进行排序
运行时出现了
查了一下说是栈堆溢出,求求大神解释一下,改如何处理。万分感谢!!

头文件:
程序代码:
#include<iostream>
#include<fstream>
using namespace std;

struct goods
{
    int num;      //货物编号
    int times;    //货物被购买的次数
};
class SeqList
{
private:
    int length;
    int maxsize;
    goods *data;
public:
    SeqList(int MaxListSize);       //构造函数
    ~SeqList() { delete[] data; }   //析构函数
    void CreateList(ifstream &F);              //创建表
    void PrintList(ofstream &F);               //打印表
    int Partition(int i, int j);    //快速排序一趟划分
    int get_length();
};
SeqList::SeqList(int MaxListSize)
{
    maxsize = MaxListSize;
    data = new goods[maxsize + 1];
    length = 0;
    data->times = { 0 };             //给所有的商品的次数赋初值为0
}
void SeqList::CreateList(ifstream &F)
{
    int x;
    while (F >> x)
    {
        if (data[x].times == 0)   //如果商品x没出现过,则长度加1
        {
            length++;
            data[x].times++;
        }
        else
            data[x].times++;
    }
}
//打印表——待会儿要改成存入文件
void SeqList::PrintList(ofstream &F)
{
    for (int i = 1; i <= length; i++)
    {
        F << i << "号货架——" << data[i].num << "号商品" << endl;
    }
}
//交换排序--对子区间进行快速排序
int SeqList::Partition(int i, int j)
{  //对R[i]…R[j]区间内的记录进行一次划分排序
    goods x = data[i];  //用区间的第一个记录为基准
    while (i<j) {
        while (i<j&&data[j].times >= x.times)
            j--;          //从j所指位置起向前(左)搜索
        if (i<j) {
            data[i] = data[j];
            i++;
        }
        while (i<j&&data[i].times <= x.times)
            i++;          //从i所指位置起向后(右)搜索
        if (i<j) {
            data[j] = data[i];
            j--;
        }
    }
    data[i] = x;         //基准记录x位于最终排序的位置i上
    return i;
}
//快速排序 注意:QuickSort不是成员函数,也不是友元函数。是C++函数。
void QuickSort(SeqList &R, int low, int high)
{   //对顺序表R中的子区间进行快速排序
        int p = R.Partition(low, high); //做一次划分排序
        QuickSort(R, low, p - 1);       //对左区间递归排序
        QuickSort(R, p + 1, high);      //对右区间递归排序
}
int SeqList::get_length()
{
    return length;
}




CPP文件:
程序代码:
#include<iostream>
#include<fstream>
#include<string>
#include"SeqList.h"
using namespace std;
void main()
{
    ifstream testfile;
    ofstream savefile;
    testfile.open("retail.dat");
    savefile.open("savefile.dat");
    SeqList L(16470);
    L.CreateList(testfile);
    int len = L.get_length();
    QuickSort(L, 1, len);
    L.PrintList(savefile);
    testfile.close();
    savefile.close();
    L.~SeqList();
    system("pause");
}
附件: 您没有浏览附件的权限,请 登录注册
2018-12-16 16:47
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:291
帖 子:6156
专家分:35512
注 册:2011-1-18
  得分:10 
不如你说出你要完成的功能,让别人帮你重写
2018-12-17 09:52
Jonny0201
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:36
帖 子:446
专家分:2241
注 册:2016-11-7
  得分:10 
排序有现成的为什么不用呢?
std::sort
2018-12-17 11:58







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.051790 second(s), 9 queries.
Copyright©2004-2019, BCCN.NET, All Rights Reserved