SWUST OJ 1042:postfixのに中置式

1042:postfixのに中置式

トピックリンク-1042:中置式後置への
ここに画像を挿入説明
問題解決のためのアイデアの
STLスタック

  • 左から右にトラバース中置式に、それが文字列strに格納されている場合
  • オペレータ場合、我々は最初の書き込みgetPriority関数算出する際に、各演算子の優先順位を決定する
    ことは、オペレータよりも低い優先度に遭遇するまで、1遭遇直接乗算と分割数スタックスタックオン
    そうでない場合は、優先度の高い事業者はスタックをオンにスタックします、直接スタックに、この時点でスタックが空の場合、プラスと2が発生したマイナス、スタックが空であるか、出会い左括弧ストップポップ
    3.出会いは、スタック上に直接かっこを残したあなたは、左括弧演算子の後に、すべてのスタックをスタック右括弧をスタックしたい顔出力左括弧を覚えているがポップしているではなく、
  • スタック操作シンボルシーケンスの残りの部分を通過した後
  • トラバース動作遭遇の文字や記号がIコード列のメモリストリングであるスタックに直接出力することができ、実際の余分(X_X)であります

コードを添付

#include<bits/stdc++.h>
#define int long long
#define lowbit(x) (x &(-x))
using namespace std;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
const double eps=1e-10;
const int M=1e9+7;
const int N=1e5+5;
typedef long long ll;
typedef pair<int,int> PII;
int getPriority(char c){//判断运算符优先级
    int level=0;
	switch(c){       
		case '(':level=1;break;        
		case '+':case '-':level=2;break;
		case '*':case '/':level=3;break;        
		default:break;    
	}    
	return level;
}
string s,str;
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	
	cin>>s;
	stack<char> st;
	for(int i=0;i<s.length();i++){
		if(isalpha(s[i]))//如果是字母
			str+=s[i];
		else if(s[i]=='(')
			st.push(s[i]);
		else if(s[i]==')'){
			while(st.top()!='('){
				str+=st.top();
				st.pop();
			}
			st.pop(); 
		}
		else{
			while(!st.empty()&&getPriority(s[i])<=getPriority(st.top())){
				str+=st.top();
				st.pop();
			}
			st.push(s[i]);
		}
	}
	while(!st.empty()){
		str+=st.top();
		st.pop();
	}
	cout<<str;
	return 0;
}
公開された90元の記事 ウォンの賞賛9 ビュー20000 +

おすすめ

転載: blog.csdn.net/Fiveneves/article/details/104585892