//不在VC6.0上了,o(∩_∩)o... 修改过了
//VS2005编译通过,Windows控制台程序。
//如果还不符合你的要求或者有什么错误,欢迎留言
//使用了STL的stack堆栈,英文不行,要支持其它运算符需要在Compare函数和function函数里作一点补充
//括号不匹配会抛出异常
//不好意思,一开始没理解什么是中缀什么是后缀表达式,相关的网上很多,你可以也查查看
#include "stdafx.h"
#include
#include
#include
using namespace std;
#define RIGHT 1
#define LEFT 0
struct Operator
{
int priority;// 优先级
int combine;// 结合性
};
Operator PrCom(char a)throw(double)// 获取其优先级和结合性
{
Operator temp;
switch(a)
{
case '+':case '-':
temp.combine=LEFT;
temp.priority=4;// 参照C++运算符的优先级表,越小越高
break;
case '*':case '/':
temp.combine=LEFT;
temp.priority=3;
break;
case '(':
temp.combine=LEFT;
temp.priority=100;// 特殊情况
break;
default:
throw 0.0;
}
return temp;
}
int Compare(char a,char b)// 比较,a比b优先级高或者优先级相同但是右结合则返回1,反之返回0
{
Operator Oa=PrCom(a),Ob=PrCom(b);
if(Oa.priority
else if(Oa.priority==Ob.priority&&Oa.combine==RIGHT)
return 1;
return 0;
}
string function( string infix )throw(double)// 抛出double型异常
{
string postfix;
stack
int i,j,n;
char c,d;
for( string::iterator iter = infix.begin(); iter != infix.end(); ++iter )// 用了迭代器 //for(i=0;i
c=*iter;//c=infix[i];
switch(c)
{
case '+':case '-':case '*':case '/':
for(j=0,n=StackOperator.size();j
d=StackOperator.top();
if(Compare(c,d))
{
StackOperator.push(c);
break;
}
else
{
StackResult1.push(StackOperator.top());
StackOperator.pop();
}
}
if(StackOperator.size()==0)
StackOperator.push(c);
break;
case '(':
StackOperator.push(c);
break;
case ')':
for(j=0,n=StackOperator.size();j
d=StackOperator.top();
if(d!='(')
{
StackResult1.push(d);
StackOperator.pop();
}
else
{
StackOperator.pop();
break;
}
}
if(j==0||j==n)
throw 0.0;
break;
default:
if((c>='A'&&c<='Z')||(c>='a'&&c<='z'))
StackResult1.push(c);
else
throw 0.0;
}
}
for(i=0,n=StackOperator.size();i
c=StackOperator.top();
if(c!='(')
{
StackResult1.push(c);
StackOperator.pop();
}
else
throw 0.0;
}
for(i=0,n=StackResult1.size();i
StackResult2.push(StackResult1.top());
StackResult1.pop();
}
for(i=0,n=StackResult2.size();i
postfix.append(1,StackResult2.top());
StackResult2.pop();
}
return postfix;
}
int _tmain(int argc, _TCHAR* argv[])
{
try
{
string temp;
cout<<"Input an expression!"<
cout<
catch(double)
{
cout<<"Error Input!"<
}
return 0;
}
有点难。
对STL,我不太熟悉。
否则,我做定了。
你是要算法过程还是要方法
解决这种问题不是给悬赏分了,是要给钱了,呵呵