Вывод последней команды удваивается (при попытке печати элементов стека) - PullRequest
0 голосов
/ 22 сентября 2019

Итак, задача состоит в том, чтобы реализовать простой стек, используя массив, и написать программу, которая вызывает методы стека, используя команды командной строки.Например:

  • set_size 5 - вызывает функцию, которая возвращает стек с 5 элементами
  • push N - вызывает stack.push (N)
  • pop - вызывает stack.pop ()
  • print - вызывает стек печати

Соответствующий код приведен ниже.:

#include <iostream>
#include <vector>
#include <string>
#include <regex>
#include <sstream>

template <class T>
class Stack
{
    int size = 0;
    T* Array;
    int top = 0;

public:
    Stack(size_t Size);
    ~Stack()
    {
        delete[] Array;
    }
    void push(T element);
    void pop();
    void print();
};
template <class T>
Stack<T>::Stack(size_t Size)
{
    size = Size;
    top = -1;
    Array = new T[size];
}
template <class T>
void Stack<T>::push(T element)
{
    if (top >= (size - 1))
    {
        std::cout << "overflow" << std::endl;
    }
    else
    {
        Array[++top] = element;
    }
}
template <class T>
void Stack<T>::pop()
{
    if (top < 0)
    {
        std::cout << "underflow" << std::endl;
    }
    else
    {
        std::cout << Array[top--] << std::endl;
    }

}
template <class T>
void Stack<T>::print()
{
    if (top == -1)
    {
        std::cout << "empty" << std::endl;
    }
    int i = -1;
    while (++i <= top)
    {
        std::cout << Array[i] << " ";
    }
    std::cout << std::endl;
}
template <class T>
Stack<T> set_size(int Size)
{
    return Stack<T>(Size);
}

int main()
{   
    int size = 0;
    std::string command, line, element;
    std::cin >> command >> size;
    if (command == "set_size")
    {
        auto stack = set_size<std::string>(size);
        while (std::getline(std::cin, line))
        {
            std::istringstream is(line);
            is >> command;
            if (command == "push")
            {
                is >> element;
                if (is.rdbuf()->in_avail() == 0)
                {
                    stack.push(element);
                }
                else
                {
                    std::cout << "error" << std::endl;
                }
            }
            if (command == "pop")
            {
                stack.pop();
            }
            if (command == "print")
            {
                stack.print();
            }
        }
    }
    return 0;
}

Но по какой-то причине вывод утилиты тестирования отличается от того, который я получаю в Visual Studio - последняя команда повторяется дважды.Ввод утилиты:

set_size 5
pop
push 1 10
push 2
push 3
push 4
push 5
print
push 6
pop
push 7
print

РЕДАКТИРОВАТЬ: По какой-то причине при нажатии введите в командной строке, она повторяет предыдущую команду, поэтому утилита повторяет последнюю print.Но я до сих пор не знаю, почему и как это исправить.

А вот выходы:

Утилита:

underflow
error
2 3 4 5 
6
2 3 4 5 7 
2 3 4 5 7 

Требуемый выход (тот, который ятакже получить в Visual Studio):

underflow
error
2 3 4 5
6
2 3 4 5 7

Я считаю, что это как-то связано с использованием istringstream или с тем, как вводятся мои команды, но я не могу понять, почемуотличается и как это исправить.Или есть способы сделать это умнее / проще?(Примечание: мне нужно проверить, существует ли только 1 push аргумент, так что вся вещь istringstream предназначена именно для этого)

1 Ответ

0 голосов
/ 22 сентября 2019

Когда вы вводите пустую строку, последующая операция ввода is >> command завершится неудачей, оставив command с последним значением, которое было print.Чтобы это исправить, либо создайте локальную переменную для работы внутри цикла, либо вызовите command.clear() перед операцией ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...