求栈中元素个数(StackLength)的两个算法那个正确

求栈中元素个数(StackLength)的两个算法那个正确,第1张

不正确, 因为前面我们已经提到过,通过继承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的最后一个元素等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9397630.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存