2011-03-12 91 views
-1
#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没有在范围内声明。为什么说我的'摧毁堆'没有被宣布?

这是我想要显示堆栈的最下面一个,它甚至说没有声明为空。 我对这些错误感到困惑,我不知道通过声明操作是什么意思?我正在使用代码块(不是Visual Studio),那么这会影响任何东西吗?

+1

除此之外,你为什么会使用堆栈呢? – 2011-03-12 03:41:14

+0

同意。我没有看到任何理由在这里使用堆栈。 – 2011-03-12 16:47:29

回答

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

从已经指出了其他错误
+0

即时通讯不好意思,但是当我昨天发布这个问题时,我没有得到任何回应,所以我摆弄了代码,我发现这是问题。但无论如何,谢谢。 – Surya 2011-03-13 04:06:46

3

因为很简单,在std::stack中没有这样的功能destroyStack。我不知道你有什么想法。

1

你应该自己实施destroyStack。函数如:

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

里调用:

destroyStack(names); 

空应该是空的()代替。

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

+0

我也想过建议实现这个功能。为了清楚起见,我保持简单的修正,但是要注意这一点很重要,**和**演示了如何将参数传递到函数中,同时保留传入的对象的更改(因为它通过参考 - 因此“&”) – 2011-03-12 04:19:25