Префикс для вставки в стек
Я пытаюсь реализовать префикс для инфикса в C++, это то, что я получил до сих пор. Например, входные данные должны быть примерно такими:
/7+23
И выход:
7/(2+3) or (7/(2+3))
Но вместо этого я получаю:
(/)
Вот код, который я написал до сих пор:
void pre_to_in(stack<char> eq) {
if(nowe.empty() != true) {
char test;
test = eq.top();
eq.pop();
if(test == '+' || test == '-' || test == '/' || test == '*') {
cout << "(";
pre_to_in(eq);
cout << test;
pre_to_in(eq);
cout << ")";
} else {
cout << test;
}
}
}
// somewhere in main()
char arr[30];
stack<char> stosik;
int i = 0;
cout << "write formula in prefix notation\n";
cin >> arr;
while(i < strlen(arr)) {
stosik.push(arr[i]);
i++;
}
pre_to_in(stc);
3 ответа
Это стек. Сначала в, последний из. Вам нужна обратная строка ввода "32+7/".
Вы используете много стеков. При каждом входе в стек pre_to_in() копируется. Используйте ссылку или указатель, например:
void pre_to_in(stack<char> &eq);
Это все.
PS Унификация имен (s/nowe/eq/g && s/stc/stosik/g)
cin >> arr;
читает только одно "слово" ввода, а не целую строку. Здесь только первый слэш-персонаж.
Не уверен, что если вы ищете такое решение, в любом случае для упомянутого вами материала оно дает вывод из вашего поста
он читает токены из ввода std
Я построил его сейчас под Visual Studio 2005 - чтобы завершить ввод, нажмите Enter, Ctrl+Z, Enter
но на других компиляторах прекращение может работать по-другому
#include <algorithm>
#include <deque>
#include <iostream>
#include <string>
typedef std::deque< std::string > tokens_t;
void pre_to_in( tokens_t* eq )
{
if ( !eq->empty() ) {
const std::string token = eq->front();
eq->pop_front();
if ( ( token == "+" ) || ( token == "-" ) || ( token == "/" ) || ( token == "*" ) ) {
std::cout << "(";
pre_to_in( eq );
std::cout << token;
pre_to_in( eq );
std::cout << ")";
} else {
std::cout << token;
}
}
}
int main()
{
std::cout << "write formula in prefix notation" << std::endl;
tokens_t tokens;
std::copy(
std::istream_iterator< std::string >( std::cin ),
std::istream_iterator< std::string >(),
std::back_inserter( tokens ) );
pre_to_in( &tokens );
}