问题描述
- 这段代码有哪里会引起RuntimeError的地方么
-
我在本地测试没出过问题,但是放到oj系统上就runtime error,错误代码11。
应该是访问到未定义的内存,可是我查了好久都没找到哪里越界了,求指教#include <cstdio> #define Length 1600050 struct StacketNode { int data; StacketNode* next; }; class Stacket { private: int _size; StacketNode* Bottom; StacketNode* Top; public: Stacket(); ~Stacket(); void Push(int tra); int Pop(); int GetTop(); private: }; Stacket::Stacket() { Bottom = new StacketNode(); Bottom->data = 0; Top = Bottom; _size = 0; } void Stacket::Push(int tra) { StacketNode* temp = new StacketNode(); temp->data = tra; temp->next = Top; Top = temp; _size++; return; } int Stacket::Pop() { StacketNode* temp; int temint; temp = Top; temint = temp->data; Top = Top->next; Top->next; delete temp; _size--; return temint; } int Stacket::GetTop() { return Top->data; } int main() { int n = 0, m = 0, b = 0, t = 0; int trains[Length]; bool Isfeasible = true; scanf("%d %d",&n,&m); int Seq[Length]; Stacket* A = new Stacket(); Stacket* B = new Stacket(); for (int i = 0; i < n; i++) { scanf("%d", &trains[i]); A->Push(n-i); } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (B->GetTop() == trains[i]) { B->Pop(); Seq[t++] = 1; b--; break; } else if(A->GetTop() == 0) { Isfeasible = false; break; } else { if (++b <= m) { B->Push(A->Pop()); Seq[t++] = 0; } else { Isfeasible = false; break; } } if (Isfeasible == false) break; } } if (Isfeasible == false) printf("Non"); else { for (int i = 0; i < t; i++) { switch (Seq[i]) { case 0: printf("pushn"); break; case 1: printf("popn"); } } } return 0; }
补充OJ问题:
描述
某列车调度站的铁道联接结构如Figure 1所示。其中,A为入口,B为出口,S为中转盲端。所有铁道均为单轨单向式:列车行驶的方向只能是从A到S,再从S到B;另外,不允许超车。因为车厢可在S中驻留,所以它们从B端驶出的次序,可能与从A端驶入的次序不同。不过S的容量有限,同时驻留的车厢不得超过m节。
设某列车由编号依次为{1, 2, ..., n}的n节车厢组成。调度员希望知道,按照以上交通规则,这些车厢能否以{a1, a2, ..., an}的次序,重新排列后从B端驶出。如果可行,应该以怎样
的次序操作?
输入
共两行。第一行为两个整数n,m。
第二行为以空格分隔的n个整数,保证为{1, 2, ..., n}的一个排列,表示待判断可行性的驶出序列{a1,a2,...,an}。
输出
若驶出序列可行,则输出操作序列,其中push表示车厢从A进入S,pop表示车厢从S进入B,每个操作占一行。若不可行,则输出No。
样例
见英文题面限制
1 ≤ n ≤ 1,600,0000 ≤ m ≤ 1,600,000
时间:2 sec
空间:256 MB
Example 1
Input5 2
1 2 3 5 4
Outputpush
pop
push
pop
push
pop
push
push
pop
pop
Example 2
Input5 5
3 1 2 4 5
OutputNo
解决方案
#define Length 1600050
int trains[Length];
int Seq[Length]; 太大导致的stack overflow,应该使用堆上的内存
int *trains=new int[Length];
int *Seq=new int[Length];
解决方案二:
过深的递归造成堆栈溢出,或者使用了太多的内存,内存溢出,或者内存泄漏