中缀转后缀
#include<stdio.h>
#include<stack>
using namespace std;
stack<int> s;
int compare(char str,char top)// 如果当前运算符优先级低于栈顶运算符,则需要pop,返回1
{
int flag=0;
if(str=='+'||str=='-')
{
if(top!='(')flag=1;
}
else if(str=='*'||str=='/')
{
//if(top=='*'||top=='/')flag=1;
if(top!='(')flag=1;
}
else if(str=='(')flag=0;
else if(str==')')
{
if(top!='(')flag=1;
}
return flag;
}
int main()
{
char str[100]={"((A+B)*C-D)*E"},str1[100];
int i=0,j=0;
int flag=0,temp=0;
for(;str[i];i++)
{
//处理数字(以字母形式表示数字)
if(str[i]>='A'&&str[i]<='Z')
{
str1[j++]=str[i];
}
//处理运算符
else if(str[i]=='('||str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/')
{
while((!s.empty())&&compare(str[i],s.top())==1)
{
str1[j++]=s.top();
s.pop();
}
s.push(str[i]);
}
else if(str[i]==')')
{
while(s.top()!='(')
{
str1[j++]=s.top();
s.pop();
}
s.pop();
}
}
while(!s.empty())
{
str1[j++]=s.top();
s.pop();
}
printf("%s",str1);
}
后缀表达式求值
#include<stdio.h>
#include<stack>
using namespace std;
stack<int> s;
//考虑多位数字 空格分割
int main()
{
char str[100]={"2 3 * 5 4 * + 9 -"};
int i=0;
int flag=0,temp=0;
for(;str[i];i++)
{
if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/')//操作符
{
int p=0,q=0,val=0;
p=s.top();
s.pop();
q=s.top();
s.pop();
switch(str[i])
{
case '+':
val=p+q;
break;
case '-':
val=q-p;
break;
case '*':
val=p*q;
break;
case '/':
val=q/p;
break;
}
//printf("val=%d\n",val);
s.push(val);
}
else if(str[i]==' ')//空格
{
if(flag==1)
{
s.push(temp);
//printf("temp=%d\n",temp);
}
temp=0;
flag=0;
}
else if(str[i]<='9'&&str[i]>='0')//数字
{
temp=temp*10+str[i]-'0';
flag=1;
}
}
printf("%d",s.top());
}
//答案为17