#include<stdio.h>
#include <string.h>
#include <stack>
#define N 1000
using namespace std;
stack<char> op;//定义保存运算符的栈
char s1[N],s2[N];
int priority(char ch)//定义运算符的优先级
{
int num;
switch(ch)
{
case ‘+‘:
case ‘-‘:return 1;
case ‘*‘:
case ‘/‘:return 2;
case ‘(‘:
case ‘)‘:return 0;
default:return -1;
}
}
int main()//将中缀表达式转换为后缀表达式
{
int T;
scanf("%d",&T);
op.push(‘#‘);
while(T--)
{
scanf("%s",s1);
int k=strlen(s1);
int top=-1;
for(int i=0;i<k;i++)
{
if(s1[i]>=‘0‘&&s1[i]<=‘9‘)
{//当是数字的时候
top++;
s2[top]=s1[i];
}
else if(s1[i]==‘+‘||s1[i]==‘-‘||s1[i]==‘*‘||s1[i]==‘/‘)
{ //如果当前的操作符比栈顶的操作符优先级大的话,则将当前操作符进栈
if(priority(s1[i])>priority(op.top())) op.push(s1[i]);
else
{ //当前运算符优先级小,则将栈中运算符优先级大于等于当前的都从栈出来
while(priority(op.top())>=priority(s1[i]))
{
top++;
s2[top]=op.top();//将栈顶的运算符出栈
op.pop();
}
op.push(s1[i]);//然后再把当前的运算符进栈
}
}
else if(s1[i]==‘(‘) op.push(s1[i]);
else if(s1[i]==‘)‘)
{
while(op.top()!=‘(‘)
{
top++;
s2[top]=op.top();
op.pop();
}
op.pop();//将左括号删除
}
}
while(op.top()!=‘#‘)//如果此时符号栈仍不为空则全部出栈
{
top++;
s2[top]=op.top();
op.pop();
}
for(int i=0;i<=top;i++)
{
printf("%c",s2[i]);
}
printf("\n");
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。