一、题目
输入一个中缀表达式,编程输出其后缀表达式,要求输出的后缀表达式的运算次序与输入的中缀表达式的运算次序相一致
二、分析
中缀表达式转后缀表达式的方法:
1.遇到操作数:直接输出(添加到后缀表达式中)
2.栈为空时,遇到运算符,直接入栈
3.遇到左括号:将其入栈
4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,括号不输出。
5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈
6.最终将栈中的元素依次出栈,输出。
其实题目中已经给出方法,我们可以按照题目送给方法,直接写出相应的代码。
三、算法实现
(主要代码)
数据结构:栈——一维字符数组。
int you(char c1,char c2)//判断运算符优先级
{
if(c1=='*'||c1=='/')
return 1;
else if((c1=='+'||c1=='-')&&(c2=='+'||c2=='-'))
return 1;
else return 0;
}
int main()
{
char stack[300];
char s[310],ch;
int i,top=-1,f=0;
gets(s);
for(i=0; s[i]; i++)
{//遇到操作数:直接输出(添加到后缀表达式中)
if(('A'<=s[i]&&s[i]<='Z')||('a'<=s[i]&&s[i]<='z'))
printf("%c",s[i]);
//栈为空时,遇到运算符,直接入栈,遇到左括号:将其入栈
else if(top==-1||s[i]=='(')
stack[++top]=s[i];
//遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,括号不输出。
else if(s[i]==')')
{
ch=stack[top--];
while(ch!='('&&top!=-1)
{
printf("%c",ch);
ch=stack[top--];
}
}
//遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈
else
{
f=you(stack[top],s[i]);
if(f==1)
{
while(f&&top!=-1)
{
printf("%c",stack[top]);
top--;
f=you(stack[top],s[i]);
}
stack[++top]=s[i];
}
else
stack[++top]=s[i];
}
}
//.最终将栈中的元素依次出栈,输出。
while(top!=-1)
{
printf("%c",stack[top--]);
}
四、算法分析
算法分析:其实就是遍历了字符串数组一趟,所以大致的时间复杂度为O(N)。
空间复杂度为O(N)。此题灵活运用了栈的“后进先出”的特点。也是很有代表意义的题目。不过这里要考虑括号,运算符的优先级等。