最后一条命令的输出加倍(尝试打印堆栈元素)

时间:2019-09-22 17:42:03

标签: c++ arrays stack

因此,任务是使用数组实现简单的堆栈,并编写一个使用命令行命令调用堆栈方法的程序。例如:

  • 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

编辑:由于某些原因,当在命令行中按 enter 时,它将重复上一个命令,因此这是该实用程序重复最后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 :(得分:0)

输入空字符串时,后续输入操作is >> command将失败,而将command保留为最后一个值,即print。要解决此问题,请创建一个局部变量以在循环内使用,或者在输入操作之前调用command.clear()