为什么说我的'destroystack'没有被宣布?

时间:2011-03-12 01:54:26

标签: c++ programming-languages stack

#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main()
{
 string name;
 double gpa;
 double high = 0;
 stack<string>names;
 for (int i=0;i<7;i++)
{
 cout << " Enter student's name and gpa " <<endl;
 cin >> gpa ;
 cin >> name ;
 if (gpa > high)
{
 names.destroyStack();
 high = gpa;
 names.push(name);
 }
 else
   if (gpa==high)
  {
   names.push(name);
  }
 }
 cout << "Highest gpa is " << high << "Names with the highest gpa are"<< endl;
 while (!names.empty)
 {
   cout <<  names.top() << endl;
   names.pop();
 }
 return 0;
 }

为了只显示具有最高gpa的名称,我必须在使用较低的gpa分数之前放置一个代码来移除堆栈。所以我认为我可以使用“destroystack()”操作但是当我使用它并尝试执行它,编译器说没有在范围内声明destroyStack。

这是我要显示堆栈的底部。它甚至说没有声明空。 我对这些错误感到困惑,我不知道通过声明操作意味着什么?我正在使用codeblocks(Not Visual studio),这会影响到什么吗?

3 个答案:

答案 0 :(得分:3)

因为,很简单,destroyStack中没有这样的函数std::stack。我不知道你在哪里有想法。

答案 1 :(得分:1)

你应该自己实现destroyStack。功能如:

void destroyStack(stack<string>& _stack)
{
  // Do whatever
}

并将其命名为:

destroyStack(names);

empty应为空()而不是。

您的编辑器,代码块或Visual Studio不会影响任何内容。

答案 2 :(得分:1)

此代码应该用于清空堆栈:

取代:

  names.destroyStack();

使用:

  while (!names.empty())  
  {
    names.pop();  
  } 

如您所见,空是一个功能;它返回一个值。在这种情况下,它返回一个布尔值(true / false),因此您需要在其后面加括号,以便调用它。

这就是为什么你得到的关于空的信息没有被宣布;这意味着编译器正在寻找一个名为empty的变量,但它不存在。通过添加parens,您告诉它您要调用函数,而不是访问变量。

“while循环”遍历堆栈中的所有项目,直到堆栈为空。这实际上意味着,对于堆栈中的每个项目,项目被“弹出”关闭(pop也是一个函数,但它返回堆栈中的项目)。最终,堆栈中没有任何内容,而while循环退出,因为empty()返回true。

有关堆栈模板所具有的功能和属性的详细参考,请查看: http://www.cppreference.com/wiki/container/stack/start