#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),这会影响到什么吗?
答案 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