|
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。 输入格式:输入在一行中给出不含空格的中缀表达式,可包含 输出格式:在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。 |
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
排坑样例
1+(-1*8)-5
1 -1 8 * + 5 -
(1+(-2+(+3-(-4))))
1 -2 3 -4 - + +
3.14159265359*+1+2*3
3.14159265359 * 1 + 2 3 * +
+1
1
考察 : 栈操作 |
注意 : 可能一开始就被括号包着 |
思路 :1. 遇到要输出的数字直接输出(正数不可带括号)
|
C/C++
#include<stdio.h>
int main()
{
char str[201],stack[201]; // 输入字符 + 模拟栈
int top=0,len=0; // 栈高,
gets(str); // 获取中缀表达式
/* 开头符号判断 */
if(str[0]=='+' || str[0]=='-') {
if(str[0]=='-') putchar('-');
len++;
}
/* 逐个字符判断 */
while (str[len]!='\0'){
char ch = str[len++];
switch (ch) {
case '(':
// 遇到左括号,注意判断(-1)这种情况
stack[++top] = '(';
if(str[len]=='+') len++;
if(str[len]=='-') printf("%c",str[len++]);
break;
case ')':
// 弹出符号,直到遇见'('为止
while (stack[top]!='(') printf(" %c",stack[top--]);
top--; // '(' 也要弹出
break;
case '+': case '-':
putchar(' '); // 前置空格先输出
// 弹出符号,直到遇到'('
while (top!=0 && (stack[top]!='(')) printf("%c ",stack[top--]);
// 将该符号压入栈
stack[++top] = ch;
break;
case '*': case '/':
putchar(' '); // 前置空格先输出
// 只要栈顶是乘号或除号就弹出
while (top!=0 && (stack[top]=='*' || stack[top]=='/')) printf("%c ",stack[top--]);
// 将该符号压入栈
stack[++top] = ch;
break;
default: putchar(ch); //数字部分遇见直接输出
}
}
while (top>0) printf(" %c",stack[top--]); // 弹出剩余的运算符
return 0;
}

3992

被折叠的 条评论
为什么被折叠?



