
不正确, 因为前面我们已经提到过,通过继承Vector,很大一部分功能的实现就由Vector涵盖了。Vector的详细实现我们会在后面分析。它实现了很多的辅助方法,给Stack的实现带来很大的便利。现在,我们按照自己的思路来分析每个方法的具体步骤,再和具体实现代码对比。
empty
从我们的思路来说,如果要判断stack是否为空,就需要有一个变量来计算当前栈的长度,如果该变量为0,则表示该栈为空。或者说我们有一个指向栈顶的变量,如果它开始的时候是设置为空的,我们可以认为栈为空。这部分的实现代码也很简单:
在这里,判断是否可以取栈顶元素在peek方法里实现了,也将如果栈为空则抛异常的部分包含在peek方法里面。这里有必要注意的一个细节就是,在通过peek()取到顶端的元素之后,我们需要用removeElementAt()方法将最顶端的元素移除。我们平时可能不太会留意到这一点。
为什么要移除呢?我们反正有一个elementCount来记录栈的长度,不管它不是也可以吗?
实际上,这么做在程序运行的时候会有一个潜在的内存泄露的问题。因为在java里面,如果我们普通定义的类型属于强引用类型。
比如这里vector就底层用的Object[]这个数组强类型来保存数据
。强类型在jvm中做gc的时候,只要程序中有引用到它,它是不会被回收的。这就意味着在这里,只要我们一直在用着stack,那么stack里面所有关联的元素就都别想释放了。这样运行时间一长就会导致内存泄露的问题。那么,为了解决这个问题,这里就是用的removeElementAt()方法。
#include <vector>
#include <iostream>
using namespace std;
//程序说明:开始时输入整数,直到输入非整数时,程序停止输入,开始输出vector中的数据。
int main()
{
int number;
vector<int> vecNumber;
cout<<"请输入整数"<<endl;
while (cin >> number)
{
vecNumberpush_back(number);
}
cout<<"开始输出vector中的数据"<<endl;
for (int i=0; i<vecNumbersize(); i++)
{
cout << vecNumber[i] << endl;
}
while(1);
}
错误观点:通过vector::end()能获取指向最后一个元素的指针。
实际上,通过上面的方法获取的是指向末尾元素再下一个位置的指针。
例子:
#include <iostream>#include <vector>
using namespace std;
int main()
{
vector<int> Int;
Intpush_back(1);
Intpush_back(5);
vector<int>::iterator it = Intend();
cout << it << endl;
return 0;
}
程序输出的不是5,而是131159。表明通过Intend()并不能获取指向容器Int中尾元素的指针。
那么如何 *** 作才正确?实验证明,令迭代器it = Intend() - 1即可。
程序:
#include <iostream>#include <vector>
using namespace std;
int main()
{
vector<int> Int;
Intpush_back(1);
Intpush_back(5);
vector<int>::iterator it = Intend() - 1;
cout << it << endl;
return 0;
}
输出5
注意的是,这里的“-1”,实际上是-sizeof(int)
我利用了algorithm里的random_shuffle函数,这个函数是随机排序的。我的思路是用另一个vector取出不要固定的元素做随机排序,然后把固定元素还原得到重排后的vector:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int i = 0;
template<typename T>
void print(vector<T> numbers)
{
for (T number : numbers)
cout << number << ","; // 为了方便没后去掉最后的逗号
cout << endl;
}
template<typename T>
void shuffleEO(vector<T> &numbers, int index) // shuffle excluding one
{
int count = numberssize(); // vectorsize(),返回vector元素个数
if (index >= count) return;
vector<T> temp;
for (i = 0; i < index; i++)
temppush_back(numbersat(i)); // vectorpush_back(),添加一个元素至vector的末尾
for (i = index+1; i < count; i++)
temppush_back(numbersat(i)); // 这里的两个for把原数组中除了index外的元素复制到了temp中,并且保持先后顺序不变
random_shuffle(tempbegin(), tempend()); // random_shuffle()是algorithm里面的一个标准库函数,有两个重载的版本,这里用的是两个参数的,还有一个三个参数的。两个参数的版本接收两个迭代器指针作为参数,前者指向序列首,后者指向序列尾,random_shuffle会对在这两个指针之间的元素随机重排。三个参数的版本额外接收一个指定重排规则的参数,不怎么常用。这里的vectorbegin()指向vector第一个元素,vectorend()指向最后一个元素的后一个位置(注意不是最后一个元素)
vector<T> temp2;
for (i = 0; i < index; i++)
temp2push_back(tempat(i)); // 先把index前的元素加入temp2中
temp2push_back(numbersat(index)); // 把index加入temp2中
for (i = index; i < count-1; i++)
temp2push_back(tempat(i)); // 最后把index后的元素加入temp2中
numbers = temp2; // 这样一来index位置不变,而其它元素已经随机排序,temp2就是最终的结果,因为按引用传递numbers,所以这里把temp2赋值给numbers
}
int main(void)
{
vector<int> test;
for (i = 0; i < 10; i++) testpush_back(i);
print(test);
cout << "Now shuffle index 0:" << endl;
for (int j = 0; j < 15; j++)
{
shuffleEO(test, 0);
print(test);
}
cout << "Now shuffle index 4:" << endl;
testclear(); // vectorclear()清空vector中的元素,相当于变为一个空的vector
for (i = 0; i < 10; i++) testpush_back(i);
print(test);
for (int j = 0; j < 15; j++)
{
shuffleEO(test, 4);
print(test);
}
return 0;
}
输出结果:
以上就是关于求栈中元素个数(StackLength)的两个算法那个正确全部的内容,包括:求栈中元素个数(StackLength)的两个算法那个正确、写一程序,输入几个整数,存放于向量vector中,再输出vector中的元素、如何利用迭代器获取vector的最后一个元素等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)