1. 程式人生 > >中綴表示式轉為字尾表示式以及求值

中綴表示式轉為字尾表示式以及求值

程式碼裡有註釋。。。直接上程式碼。。。

#include<bits/stdc++.h>
#define rep(i,k,n) for(int i=k;i<=n;i++)
#define per(i,n,k) for(int i=n;i>=k;i--)
#define pii pair<int,int>
#define pb push_back
#define mp make_pair
#define ll long long
#define re return
#define se second
#define fi first
using namespace std;
//---------------------------------------------------------------head----------------------------------------------------------------------
stack<int> si;
stack<char> sc;
vector<int> vc;
bool isnum[1005];
int clas(char c)//符號優先順序 
{
	if(c=='(' || c==')') re 0;
	if(c=='+' || c=='-') re 1;
	if(c=='*' || c=='/') re 2;
	if(c=='^') re 3;
	re 4;
}
int cal(int a,int b,char c)//符號求值 
{
	int ans=1;
	if(c=='+') re a+b;
	if(c=='-') re b-a;
	if(c=='*') re a*b;
	if(c=='/') re b/a;
	rep(i,1,a) ans*=b;
	re ans;
}
int main()
{
	string s;cin>>s;
	s="("+s+")";//可以用來防止棧為空找top時的溢位情況 
	int n=(int)s.size();
	rep(i,0,n-1)
	{
		if(s[i]=='(')//左括號直接壓入 
		{
			sc.push(s[i]);
			continue;
		}
		if(s[i]==')')//找到右括號將棧清空到左括號為止 
		{
			char c=sc.top();sc.pop();
			while(c!='(')
			{
				vc.pb(c);
				c=sc.top();sc.pop();
			}
			continue;
		}
		if(s[i]>='0' && s[i]<='9')//數字 
		{
			int sum=0;
			while(s[i]>='0' && s[i]<='9')
			sum=sum*10+s[i++]-'0';
			vc.pb(sum);
			isnum[vc.size()-1]=1;
			i--;continue;
		}
		while(!sc.empty() && clas(s[i])<=clas(sc.top()))//如果是符號就找到第一個優先順序比他小的 
		vc.pb(sc.top()),sc.pop();
		sc.push(s[i]);
	}
	while(!sc.empty())//清空棧 
	vc.pb(sc.top()),sc.pop();
	rep(i,0,vc.size()-1)//根據字尾表示式求值 
	{
		if(!isnum[i])
		{
			int a=si.top();si.pop();
			int b=si.top();si.pop();
			int ans=cal(a,b,vc[i]);
			si.push(ans);
		} 
		else
		si.push(vc[i]);
	}
	cout<<si.top();
	return 0;
}
//----------------------------------------------------------------end----------------------------------------------------------------------