Я хочу назначить указатель на каждый символ, который вводит пользователь. Тогда при этом я, вероятно, смогу использовать цикл для хранения символов, а второй цикл изменить порядок стеков, используя указатели. Но я не знаю, как написать это в форме программы, и я не уверен, что это может работать. Вот что у меня так далеко:
#include<iostream>
using namespace std;
class Stack{
public:
enum {MaxStack = 50};
void init() {top = -1;}
void push( char n ){
if ( isFull() ) {
cerr << "Full Stack. DON'T PUSH\n";
return;
}
else {
arr[ ++top ] = n;
cout << "Just pushed " << n << endl;
return;}
}
int pop() {
if (isEmpty() ) {
cerr << "\tEmpty Stack. Don't Pop\n\n";
return 1;
}
else
return arr[top--];
}
bool isEmpty() {return top < 0 ? 1 : 0;}
bool isFull() {return top >= MaxStack -1 ? top : 0;}
void dump_stack() {
cout << "The Stack contents, from top to bottom, from a stack dump are: " << endl;
for (int i = top; i >= 0; i--)
cout << "\t\t" << arr[i] << endl;
}
private:
int top;
int arr[MaxStack];
};
int main()
{
Stack a_stack;
int x = 0;
char inputchar;cout<<"Please enter a word"<<endl;
a_stack.init();
while (inputchar != '.') //terminating char
{
cin >> inputchar;
array[x] = inputchar;
x++;
}
int j = x;
for (int i = 0; i < j; i++)
{
cout << array[x];
x--;
}
a_stack.push();
a_stack.dump_stack();
return 0;
}
Стек, по самой своей природе LIFO (Last In, First Out), изменит порядок всего, что вы в него положите. Пример для строки «Hello»:
(Верхняя часть стека находится слева)
H push "H"eH push "e"leH push "l"lleH push "l"olleH push "o"
Теперь, когда вы выталкиваете из стека, вы сначала получаете «o», затем «l» и т. Д. Это все, что вы положили, но в обратном порядке. Вам не нужно делать ничего особенного, чтобы достичь этого. Просто нажмите, чтобы сложить в обычном порядке, и когда вы получите, вы получите его в обратном порядке:
// while loop
{
cin >> inputchar;
a_stack.push(inputchar);
}
// Display in reverse
while (not a_stack.isEmpty()) {
cout << (char)a_stack.pop();
}
Вот небольшой пример программы, использующей std::stack
:
(Здесь нет проверки ошибок ввода.)
#include <iostream>
#include <stack>
int main()
{
std::stack<char> st;
char c = '\0';
while (c != '.') {
c = std::cin.get();
st.push(c);
}
while (not st.empty()) {
std::cout << st.top();
st.pop();
}
std::cout << '\n';
}
Пример ввода и вывода:
Привет, мир. .dlrow olleH
Если использование стека не является обязательным (т.е. это домашнее задание), вам может быть лучше с getline()
его параметр delim
(ср GetLine) с последующим обратным циклом над массивом. Это будет быстрее, чище, менее подвержено ошибкам и в основном будет двухсторонним.