【问题标题】:Comparing stacks比较堆栈
【发布时间】:2018-08-04 10:30:30
【问题描述】:

我有一个项目来比较两个堆栈的内容,但我遇到了这个函数的问题。我相信我已经正确完成了程序的其余部分。我在 B.myCharacters.empty() (表达式必须具有类类型)和 B==B.myCharacters (没有运算符“==”与这些操作数匹配)上遇到错误。

bool CharStack::IsEqual(CharStack & B) 
{
    if (B.empty()) 
    {
        cout << "Stack is empty" << endl;
        return false;
    } 
    else if (B.myCharacters.empty()) 
    {
        cout << "Stack is empty" << endl;
        return false;
    } 
    else if (B == B.myCharacters)
        return true;
}

任何帮助将不胜感激。

这是标题和驱动程序。它们是老师为这个项目提供的,我不能更改它们,即使有更好的方法。

#include <iostream>

#include <string>

using namespace std;

const int STACK_CAPACITY = 128;

typedef char StackElement;

class CharStack
{
private:
    char myCharacters[STACK_CAPACITY]; // STL stack of chars.
    int myTop;

public:
    CharStack();
    bool empty();
    void push(const StackElement & value);
    StackElement top() const;
    void pop();
    void StringToStack(const string & inStr);
    friend ostream & operator <<(ostream & out, const CharStack & CS);
    CharStack Reverse();
    bool IsEqual(CharStack & B);
};

司机

#include <string>
#include <cassert>
#include "Header.h"

using namespace std;
//introduces namespace std

int main(void)
{
    ifstream in;
    string fileName, line[30];
    int i = 0;
    CharStack N, M, P;
    cout << "Enter file name for palindrome check: ";
    cin >> fileName;
    in.open(fileName.c_str());
    assert(in.is_open());
    while (!in.eof())
    {
        getline(in, line[i]);
        N.StringToStack(line[i]);
        cout << N << endl;
        P = N;
        M = N.Reverse();
        if (P.IsEqual(M))
            cout << "This line is a palindrome line" << endl;
        else
            cout << "This line is not a palindrome line" << endl;
        i++;
    }

    cout << "\nProgram ended normally.\n";
    system("pause");
}

【问题讨论】:

  • 请提供minimal reproducible example。在不知道CharStack 是什么的情况下,没有人可以提供帮助。
  • 欢迎!不幸的是,除非您发布使用的代码,特别是 CharStack 的定义,否则我们无法为您提供太多帮助。请参阅here 了解所需内容。
  • 还请注意,说两个空堆栈相等是有道理的。在您的代码 sn-p 中它们不是。
  • 您收到有关缺少运算符的错误,因为您尚未定义如何比较两个不同的事物(BB.mycharacters)。 IE。你需要定义CharStack::operator==(const T&amp; otherCharacters) const。 (另请注意,您可能不希望在您的实际解决方案中使用此运算符。这只是您当前的解决方案不需要抱怨缺少此运算符的运算符。)
  • 这次可能不是你的问题,但这个问题中描述的错误迟早会得到你:Why is iostream::eof inside a loop condition considered wrong?

标签: c++ string char stack


【解决方案1】:

假设您的CharStack 内部将字符保留在std::string 中,即

class CharStack
{
    std::string myCharacters;    // internal data
  public:
    bool IsEqual(CharStack const&) const;
    /* ... */
};

如果两个堆栈相同,IsEqual() 应该返回,那么实现很简单

bool CharStack::IsEqual(CharStack const&other) const
{
    return myCharacters == other.myCharacters;
}

这将一个空堆栈和一个非空堆栈比较为不相等,但将两个空堆栈比较为相等,这可以说是正确的行为。如果你想让两个空栈不相等,你可以

bool CharStack::IsEqualNonEmpty(CharStack const&other) const
{
    return !myCharacters.empty() && myCharacters == other.myCharacters;
}

还要注意关键字const 的各种用法。

【讨论】:

  • 在尝试比较它们之前,我还必须确保堆栈不为空。
  • 什么意思?如果为空,它们应该如何比较?另请参阅我的编辑。
  • 如果它们为空,则不应比较它们。如果其中一个或两个堆栈为空,它应该返回 false,然后显示错误消息。这几乎就像比较它们的前提条件,但它是在函数内部完成的。
  • 没有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多