Выполните операции INSERT и REMOVE, как указано в текстовом файле. Результатом является «стек», если все операции удаления возможны (не происходят, когда стек пуст), а операнд каждой операции удаления равен фактическому значению, полученному из вашего стека.
ОБНОВЛЕНО 2020- 02-29
Невозможно создать два отдельных массива для операций INSERT и REMOVE и обработать их независимо, поскольку результат зависит от того, как операции чередуются. Например,
INSERT 1
INSERT 2
REMOVE 2
REMOVE 1
должно привести к stack
, но если мы переместим одну операцию REMOVE вверх:
INSERT 1
REMOVE 2
INSERT 2
REMOVE 1
, результат станет not stack
. Это означает, что вам нужно обрабатывать операции в том же порядке, в каком они отображаются в файле.
Общая структура кода:
ifstream inFile;
inFile.open("StackTest.txt");
int num;
while (inFile >> num) { // Read number of INSERT/REMOVE in each test set
stack<int> s;
bool isStack = true;
for (int i = 0; i < num; i++) {
// Read and process all INSERT/REMOVE operations in this test set
// Set isStack to false if not stack behavior detected
}
cout << (isStack ? "stack" : "not stack") << endl;
}
inFile.close();
Когда мы читаем операции из ввода файл мы пытаемся их выполнить. Операции INSERT должны выполняться как есть, проверки не требуются.
if (operation == "INSERT") {
s.push(argument);
}
Операции REMOVE требуют выполнения двух проверок: пуст ли стек и содержит ли вершина стека то же число, что и аргумент операции УДАЛИТЬ. Если одна из проверок не удалась, мы устанавливаем для isStack значение false.
if (operation == "REMOVE") {
if (s.empty() || s.top() != argument) {
isStack = false;
}
if (!s.empty()) {
s.pop ();
}
}
Объединяя это вместе, мы получаем:
#include <iostream>
#include <fstream>
#include <string>
#include <stack>
using namespace std;
int main () {
ifstream inFile;
inFile.open("StackTest.txt");
int num;
while (inFile >> num) {
stack<int> s;
bool isStack = true;
for (int i = 0; i < num; i++) {
string operation;
int argument;
inFile >> operation >> argument;
if (!isStack)
continue;
if (operation == "INSERT") {
s.push(argument);
}
else if (operation == "REMOVE") {
if (s.empty() || s.top() != argument) {
isStack = false;
}
if (!s.empty()) {
s.pop ();
}
}
}
cout << (isStack ? "stack" : "not stack") << endl;
}
inFile.close();
}
Еще одна вещь, которую стоит упомянуть: после того, как мы прочитали Имя операции и ее аргумент из файла мы проверяем
if (!isStack)
continue;
Это утверждение не требуется, оно существует только для повышения производительности. Если мы уже обнаружили, что данный набор тестов не соответствует стеку, нам не нужно выполнять все оставшиеся операции в этом наборе тестов, мы просто пропускаем их. Вы можете безопасно удалить это утверждение, не влияя на результат.