2

我正在尝试在 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);
4

3 回答 3

1
  1. 这是一个堆栈。先入后出。您需要反向输入字符串“32+7/”。

  2. 您使用许多堆栈。在每次进入 pre_to_in() 堆栈时都会被复制。使用引用或指针,例如:void pre_to_in(stack<char> &eq);

就这样。

PS统一名称(s/nowe/eq/g && s/stc/stosik/g)

于 2009-12-09T23:15:03.907 回答
0

不确定您是否正在寻找这样的解决方案,无论如何,对于您提到的输入,它会给出您发布的输出

它从标准输入中读取标记

我现在在 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 );
}
于 2009-12-10T20:39:20.177 回答
0
cin >> arr;

只读取输入的一个“单词”,而不是整行。在这里它只得到第一个斜杠字符。

于 2009-12-09T22:48:18.687 回答