因此,任务是使用数组实现简单的堆栈,并编写一个使用命令行命令调用堆栈方法的程序。例如:
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 事情都应该做到这一点)
答案 0 :(得分:0)
输入空字符串时,后续输入操作is >> command
将失败,而将command
保留为最后一个值,即print
。要解决此问题,请创建一个局部变量以在循环内使用,或者在输入操作之前调用command.clear()
。