C ++, используя stack.h, читает строку, а затем отображает ее в обратном порядке

Для моего текущего назначения я должен использовать следующий файл заголовка,

#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;

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++ один раз за цикл — это увеличивает нашу позицию в строке. Делая это сейчас, вы фактически увеличиваете позицию в два раза и, таким образом, толкаете только каждого другого персонажа.

0

Другие решения

Использовать linked list вместо array в стеке.

В связанном списке всегда храните хвостовой указатель последнего узла вашего списка. Каждый узел поддерживает ссылку на ваш предыдущий узел.

A <--- B <---- C (tail)

От себя:

A <--- B <---- C <---- D (tail)

поп:

A <--- B <---- C (tail)

// D is popped out

когда tail == nullвы знаете, что это пустой стек

0

По вопросам рекламы [email protected]