主要思想:
利用栈的先进先出的特点,创建两个栈。一个存数字,一个存运算符。存在可以优化的地方,不过现在懒得去搞。遇到数字就入栈,遇到运算符则是判断与上一个运算符的优先级,根据优先级选择让之前的运算符出栈还是自己入栈。
现在存在的明显缺点是只能转换10以下的运算式,和我采用的判断方法有关,实在是懒得改了。
代码:
#include<iostream>
#include<cstring>
#include<cctype>
#include<cstdlib>
using namespace std;
typedef struct strack{
char a[100];
int top;
} Strack;
bool priority(char a,char b)
{
if((b=='+'||b=='-')&&a!='(')
return true;
if((b=='*'||b=='/')&&(a=='*'||a=='/'))
return true;
if(b==')'&&a!='(')
return true;
else
return false;
}
void push(Strack *s,char e)
{
s->top++;
s->a[s->top]=e;
}
char pop(Strack *s)
{
char e=s->a[s->top];
s->a[s->top]=0;
s->top--;
return e;
}
void before1(char *str)
{
int len=strlen(str);
Strack s1,s2;
memset(s1.a,0,sizeof(s1.a));
memset(s2.a,0,sizeof(s2.a));
s1.top=-1;
s2.top=-1;
for(int i=0;i<len;i++){
if(isdigit(str[i])){
push(&s2,str[i]);
}else {
if(s1.top!=-1){
int j=s1.top;
while(priority(s1.a[j],str[i]))
{
if(j==-1)
break;
push(&s2,pop(&s1));
j--;
}
if(s1.a[j]=='('&&str[i]==')'){
pop(&s1);
continue;
}
}
push(&s1,str[i]);
}
}
while(s1.top!=-1)
{
push(&s2,pop(&s1));
}
for(int i=0;i<len;i++)
cout<<s2.a[i];
cout<<endl;
}
int main()
{
char str[100];
while(cin>>str)
{
before1(str);
}
return 0;
}