堆栈上的中缀前缀

时间:2009-12-09 22:37:43

标签: c++ algorithm prefix infix-notation

我正在尝试用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 个答案:

答案 0 :(得分:1)

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

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

  3. 多数人。

    P.S。统一名称(s / nowe / eq / g&amp;&amp; s / stc / stosik / g)

答案 1 :(得分:0)

cin >> arr;

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

答案 2 :(得分: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 );
}