Ошибка при переносе элементов из std :: string в стек типа String - PullRequest
0 голосов
/ 18 апреля 2020

Я получаю эту ошибку при попытке l oop через строку в pu sh каждый элемент в стек типа s1 в моей функции isPalindrome().

нет экземпляр перегруженной функции "std :: stack <_Ty, _Container> :: push [with _Ty = std :: string, _Container = std :: deque>]" соответствует списку аргументов

Когда я assign, элемент, находящийся на вершине стека, в строковую переменную выдает ошибку:

'std :: stack >> :: top': нестандартный синтаксис; используйте '&', чтобы создать указатель на член

Почему упоминается std::deque?

#include <iostream>
#include <string>
#include <stack>
#include <algorithm> 

class Palindrome
{
public:
    Palindrome();
    void inputString();
    std::string convert2lower();
    bool isPalindrome();

private:
    std::string userstring;
    std::stack<std::string> s1;
};

Palindrome::Palindrome()
{}

void Palindrome::inputString()
{
    std::cout << "Enter a string: ";
    std::getline(std::cin,userstring);
}

std::string Palindrome::convert2lower()
{
    userstring.erase(remove(userstring.begin(), userstring.end(), ' '), userstring.end());
    userstring.erase(std::remove_if(userstring.begin(), userstring.end(), ispunct), userstring.end());
    transform(userstring.begin(), userstring.end(), userstring.begin(), tolower);
    return userstring;
}

bool Palindrome::isPalindrome()
{
    size_t n = userstring.size();

    for (size_t i = 0; i < n; ++i)
    {
        s1.push(userstring[i]);
    }

    std::string reversed;
    for (size_t i = 0; i < n; ++i)
    {
        std::string temp = s1.top;
        reversed.insert(i,temp);
        s1.pop();
    }

    if (reversed == userstring) 
    {
        return true;
    }

    return false;
}

int main()
{
    Palindrome p1;

    p1.inputString();

    std::cout << "\nCalling convert2lower(): " << std::endl;
    std::cout << "The new string is " << p1.convert2lower() << std::endl;
    std::cout << "\nCalling isPalindrome(): " << std::endl;

    if (!p1.isPalindrome())
    {
        std::cout << "String is NOT a Palindrome!" << std::endl;
    }
    else
    {
        std::cout << "String is a Palindrome!" << std::endl;
    }
}

1 Ответ

2 голосов
/ 18 апреля 2020

Вот ваш код с фиксированными минимальными изменениями ...

#include <iostream>
#include <string>
#include <stack>
#include <algorithm> 

class Palindrome
{
public:
    Palindrome();
    void inputString();
    std::string convert2lower();
    bool isPalindrome();

private:
    std::string userstring;
    std::stack<char> s1;
};

Palindrome::Palindrome()
{}

void Palindrome::inputString()
{
    std::cout << "Enter a string: ";
    std::getline(std::cin, userstring);
}

std::string Palindrome::convert2lower()
{
    userstring.erase(remove(userstring.begin(), userstring.end(), ' '), userstring.end());
    userstring.erase(std::remove_if(userstring.begin(), userstring.end(), ispunct), userstring.end());
    transform(userstring.begin(), userstring.end(), userstring.begin(), tolower);
    return userstring;
}

bool Palindrome::isPalindrome()
{
    size_t n = userstring.size();

    for (size_t i = 0; i < n; ++i)
    {
        s1.push(userstring[i]);
    }

    std::string reversed;
    for (size_t i = 0; i < n; ++i)
    {
        char temp = s1.top();
        reversed.insert(i, &temp, 1);
        s1.pop();
    }

    if (reversed == userstring)
    {
        return true;
    }

    return false;
}

int main()
{
    Palindrome p1;

    p1.inputString();

    std::cout << "\nCalling convert2lower(): " << std::endl;
    std::cout << "The new string is " << p1.convert2lower() << std::endl;
    std::cout << "\nCalling isPalindrome(): " << std::endl;

    if (!p1.isPalindrome())
    {
        std::cout << "String is NOT a Palindrome!" << std::endl;
    }
    else
    {
        std::cout << "String is a Palindrome!" << std::endl;
    }
}

Вот ответы на ваши вопросы:

  1. ни одного случая ... это вызвано используя строку вместо char в качестве типа стека.
  2. нестандартный синтаксис ... это потому, что вы оставили () выключенным из pop.
  3. deque упоминается, потому что стек является специализацией deque.
...