中缀式转后缀式
栈当中只保存了操作符
1.如果遇到操作数,直接输出。
2.如果遇到操作符,则将其压入到栈中,遇到左括号时也将其压入栈中。
3.如果遇到一个右括号,则依次将栈顶元素弹出,并输出,直到遇到左括号为止。注意,左括号只弹出并不输出。
4.如果遇到任何其他的操作符,如("+", "*","(")等,从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。
弹出完这些元素后,才将遇到的操作符压入到栈中。有一点需要注意,只有在遇到" ) "的情况下才弹出" ( ",其他情况都不会弹出" ( "。
5.弹出运算符时,遵循优先级高的优先弹出。在左括号压栈之前,其优先级最高,压栈之后,其优先级最低。
6.如果我们读到了输入的末尾,则将栈中所有元素依次弹出。
注意:
1. 由于遇到运算数便立即输出了,所以栈当中便只保存了操作符,那么只需要判断其优先级从而确定输出的顺序即可
2. 运算数可能是正整数,负整数,小数(正负)
3. 负号只能是出现在开头或者是在中间的某一个'('之后
表达式转换(25 分)
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+
、-
、*
、\
以及左右括号()
,表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
#include <>
#include <>
#include <>
void print(){
static int flag = 0;
if(flag) putchar(' ');
flag++;
}
int main(){
char stack[50];
char str[50];
scanf("%s", str);
int len = strlen(str);
int top = 0;//压栈之后top++,所以每一次top都是栈顶的下一个位置
for(int i = 0; i<len; i++){
//处理运算数(此处的+ -表示正负,而非加减
if((str[i] == '+' || str[i] == '-') && (!i || str[i - 1] == '(') || (str[i] >= '0' && str[i] <= '9')){
print();
if(str[i] != '+') putchar(str[i]);
while(str[i + 1] == '.' || (str[i + 1] >= '0' && str[i + 1] <= '9'))
putchar(str[++i]);
}
else{
//处理运算符
if(str[i] == ')'){//遇到右括号,则需要将左括号前的运算符全部弹栈输出
while(top && stack[top-1] != '('){
print();
putchar(stack[--top]);
}
//如果栈不为空
if(top) --top; //左括号只弹栈,不输出
}
else{
if(!top){ //栈为空,无须比较,直接压栈
stack[top++] = str[i];
continue;
}
//根据优先级顺序,压栈||(弹栈后压栈)
while(top && stack[top-1] != '('){
//比较优先级,如果str[i]的优先级大于栈顶运算符的优先级,直接压栈
if(str[i] == '(' || ((str[i] == '*' || str[i] == '/') && (stack[top-1] == '-' || stack[top-1] == '+')))
break;
print();
//如果str[i]的优先级小于栈顶的优先级,弹栈,之后再把str[i]压栈
printf("%c", stack[--top]);
}
stack[top++] = str[i];
}
}
}
while(top){ //所有运算数均已操作完毕,最后将栈中剩余的操作符全部输出
print();
//左括号不输出
if(stack[top-1] != '(')
putchar(stack[--top]);
else top--;
}
return 0;
}
这个题被“=” 和“==”坑惨了o(╥﹏╥)o