我有两个函数用于计算给定数字集的范围。
跨度的定义:给定向量X,X [i]的跨度S [i]为 紧接在前的连续元素X [j]的最大数量 X [i]使得X [j] <= X [i]。
例如:
我试图以两种方式实现该算法。第一种方法是不使用堆栈ADT,第二种方法是使用堆栈ADT;但是,使用这两种算法我都会遇到分段错误,而我无法弄清楚原因!任何帮助将不胜感激!
/*Stack.cpp
Implementation of the Stack class.
*/
#include "Stack.h"
....
vector<int> spans1(vector<int>& x) {
int j = 0;
vector<int> s;
for( int i = 0; i < x.size()-1; i++ ) {
j = 1;
while( j <= i && x[i-j] <= x[j] )
j++;
s[i] = j;
}
return s;
}
vector<int> spans2(vector<int>& x) {
Stack t;
vector<int> span;
int j = 0;
for( int i = 0; i < x.size()-1; i++ ) {
do {
if( t.isEmpty() == true ) j = -1;
else j = t.pop(); //removes the element at the top of the stack
}
while( j != -1 && x[i] >= x[j] );
span[i] = i - j;
if( j != -1 ) t.push( j );
t.push( i );
}
return span;
}
// --------------------------------------------- --------------------------------
/*Main.cpp
Tests all functionality of the Stack class.
*/
#include <iostream>
#include <stdexcept>
#include "Stack.h"
int main() {
try {
vector<int> v;
v.push_back(6);
v.push_back(3);
v.push_back(4);
v.push_back(2);
v.push_back(7);
v.push_back(5);
v.push_back(8);
v.push_back(8);
for( int i = 0; i < v.size(); i++ ) //output v
cout << v[i] << " ";
vector<int> sp1(spans1(v)); //My program crashes here
vector<int> sp2(spans2(v)); //It crashes here also (if the previous line is
//commented out)
for( int i = 0; i < sp1.size(); i++ ) //output sp1
cout << "sp1: " << sp1[i] << " ";
for( int i = 0; i < sp2.size(); i++ ) //output sp2
cout << "sp2: " << sp2[i] << " ";
}
catch( int x ) {
if( x = -1 )
cout << "Access to empty stack";
}
}
答案 0 :(得分:1)
您在代码中遇到各种问题。建议始终使用所有警告进行编译。
首先:Stack& Stack::operator=(const Stack& s)
必须返回一个值,而修复方法是将行return *this;
添加为方法的最后一行(这用于链接赋值示例{{ 1}}
第二:int a = b = c = 3;
函数已声明并被调用但未实现。
第三个和真正的问题: spans1 中的行vector<int> spans2(vector<int>& x);
声明了一个空向量,当您在此之后将其编入索引vector<int> s;
时是一个无效的访问内存,修复是通过s[i] = j;
改变坏行,它初始化大小与x相同的向量和所有值为0的元素。
答案 1 :(得分:0)
您的分段错误很可能来自于越界写入。 在写入之前,您必须确保向量的大小合适。
vector<int> spans1(vector<int>& x) {
int j = 0;
vector<int> s; // < s is empty.
for( int i = 0; i < x.size()-1; i++ ) {
j = 1;
while( j <= i && x[i-j] <= x[j] )
j++;
s[i] = j; // < You write to empty s here.
}
return s;
}
尝试将vector<int> s;
更改为vector<int> s(x.empty() ? 0 : x.size()-1);
。
spans2
有一个非常类似的问题。