C++ では、これらの中置式(
, )
, +
, -
,*
を/
スタックを使用して後置に変換しようとしていますが、出力にすべての入力が出力されるわけではありません。プログラムの実行後、括弧は出力に表示されません。エラーもありません。
このイメージは、コンパイル後の出力を示しています。
コード:
#include <iostream> #include <スタック> #include <strings.h> 名前空間 std を使用します。 int operatorPrecedence(文字演算子); void infixtoPostfix(string exp); int main() { 文字列式; cout << "インフィックス式を入力してください: "; シン >> 経験; infixtoPostfix(exp); 0 を返します。 } int operatorPrecedence(文字演算子){ //演算子の優先順位をチェック if (operators == '/') return 2; それ以外の場合 (演算子 == '*') は 2 を返します。 それ以外の場合 (演算子 == '+') は 1 を返します。 それ以外の場合 (演算子 == '-') は 1 を返します。 それ以外の場合は -1 を返します。 } void infixtoPostfix(string exp){ stack<char> s; s.push('N');//スタックの末尾を示すスタック内の要素 int len = exp.length(); string ns;//結果の最終文字列 for(int i = 0; i < len; i++){ //オペランドを表示文字列に格納 if ((exp[i] >= 'A' && exp[i] <= 'Z') || (exp[i] >= 'a' && exp[i] <='z') || (exp [i] >= '0' && exp[i] <= '9')) ns += exp[i]; //中括弧/括弧のチェック そうでなければ (exp[i] == '(') s.push(exp[i]); それ以外の場合 (exp[i] == ')'){ while (s.top() != 'N' && s.top() != '('){ char c = s.top(); s.pop(); ns += c; } //空の場合は括弧をポップ if (s.top() == '('){ char c = s.top(); s.pop(); } } そうしないと{ //スキャンされた演算子がスタックに格納された演算子よりも小さいかどうかを確認します while (s.top() != 'N' && operatorPrecedence(exp[i]) <= operatorPrecedence(s.top())){ char c = s.top(); s.pop(); ns += c; } s.push(exp[i]); } } //スタックに保存されている他のすべてをポップアウトする while (s.top() != 'N'){ char c = s.top(); s.pop(); ns += c; } cout << "後置式: " << ns << endl; }