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
cin >> arr;

行全体ではなく、入力の1つの「単語」のみを読み取ります。ここでは、最初のスラッシュ文字のみを取得しています。

于 2009-12-09T22:48:18.687 に答える
0

そのような解決策を探しているかどうかはわかりませんが、とにかく、あなたが言及した入力に対して、投稿からの出力が得られます

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 );
}
于 2009-12-10T20:39:20.177 に答える