Итак, задача состоит в том, чтобы реализовать простой стек, используя массив, и написать программу, которая вызывает методы стека, используя команды командной строки.Например:
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 предназначена именно для этого)