Для моего текущего назначения я должен использовать следующий файл заголовка,
#ifndef STACK_H
#define STACK_H
template <class T, int n>
class STACK
{
private:
T a[n];
int counter;
public:
void MakeStack() {
counter = 0;
}
bool FullStack() {
return (counter == n) ? true : false ;
}
bool EmptyStack() {
return (counter == 0) ? true : false ;
}
void PushStack(T x) {
a[counter] = x;
counter++;
}
T PopStack() {
counter--;
return a[counter];
}
};
#endif
Чтобы написать программу, которая получит предложение, сохраните его в «стеке», а затем отобразите в обратном порядке, и я должен позволить пользователю повторять этот процесс столько раз, сколько он хочет. Дело в том, что мне НЕ разрешается использовать массивы (в противном случае мне не нужна помощь с этим), и я нахожусь в тупике.
Чтобы дать представление о том, что я пытаюсь сделать, вот мой код публикации, который, очевидно, не работает полностью, а просто предназначен для того, чтобы дать представление о назначении.
#include <iostream>
#include <cstring>
#include <ctime>
#include "STACK.h"using namespace std;
int main(void)
{
auto time_t a;
auto STACK<char, 256> s;
auto string curStr;
auto int i;
// Displays the current time and date
time(&a);
cout << "Today is " << ctime(&a) << endl;
s.MakeStack();
cin >> curStr;
i = 0;
do
{
s.PushStack(curStr[i]);
i++;
} while (s.FullStack() == false);
do
{
cout << s.PopStack();
} while (s.EmptyStack() == false);
return 0;
} // end of "main"
ОБНОВИТЬ
Это мой код в настоящее время
#include <iostream>
#include <string>
#include <ctime>
#include "STACK.h"using namespace std;
time_t a;
STACK<char, 256> s;
string curStr;
int i;
int n;
// Displays the current time and date
time(&a);
cout << "Today is " << ctime(&a) << endl;
s.MakeStack();
getline(cin, curStr);
i = 0;
n = curStr.size();
do
{
s.PushStack(curStr[i++]);
i++;
}while(i < n);
do
{
cout << s.PopStack();
}while( !(s.EmptyStack()) );
return 0;
Вы на правильном пути, но вы не должны зацикливаться, пока стек полный — нет никаких гарантий curStr
состоит не менее чем из 256 символов. Вместо этого, цикл, как показано ниже …
int n = curStr.size();
do {
s.PushStack(curStr[i++]);
} while (i < n);
Теперь вы действительно не должны писать <bool-expr> == false
или же <bool-expr> == true
… вместо этого просто напишите !<bool-expr>
а также <bool-expr>
соответственно. Вам не нужны все ваши auto
Спецификаторы хранения для локальных переменных тоже. Ваш профессор должен также изучить использование конструктора, а не использование MakeStack
,
редактировать: кажется, у вас были некоторые проблемы с переводом моего кода. Вам нужно только i++
один раз за цикл — это увеличивает нашу позицию в строке. Делая это сейчас, вы фактически увеличиваете позицию в два раза и, таким образом, толкаете только каждого другого персонажа.
Использовать linked list
вместо array
в стеке.
В связанном списке всегда храните хвостовой указатель последнего узла вашего списка. Каждый узел поддерживает ссылку на ваш предыдущий узел.
A <--- B <---- C (tail)
От себя:
A <--- B <---- C <---- D (tail)
поп:
A <--- B <---- C (tail)
// D is popped out
когда tail == null
вы знаете, что это пустой стек