中缀表达式转化为后缀表达式
反思
电脑是不会骗人的,错了就是错了
起初写完,一直报错访问越界,检查了好久也没查出来,贼生气,一遍又一遍瞪着屏幕看代码,就是找不到原因,甚至怀疑是栈头文件函数写错了,改了好久还是不对,贼生气,更暴躁地看代码,还是没查出来。然后,刷csdn看到一篇教使用调试的文章,有句话 “电脑是不会不会骗人的,错了就是错了”邦邦敲醒我,于是沉下心来,在纸上一步一步地把程序执行结果写下来,一一对照,终于发现了问题。以后debug的时候也要这样!
/*
遇到一个数就输出该数
如果遇到左括号就把左括号入栈
如果遇到右括号,不断取出栈顶并输出 直到栈顶为左括号 然后左括号出栈
若遇到运算符 只要栈顶符号的优先级大于等于新符号 就不断取出栈顶并输出 最后把新符号进栈
优先级为乘除大于加减大于左括号
读完字符数组之后要让所有元素出栈
*/
# include<stdio.h>
# include"Stack.h"
int main()
{
char a[100];
scanf("%s",a);
Stack b,*S;
S = &b;
initStack(S);
int i = 0;
while(a[i] != '\0')
{
if(a[i]>='0' && a[i]<='9')//遇到一个数就输出该数
{
printf("%c",a[i]);
i++;
}
else if(a[i] == '(')//如果遇到左括号就把左括号入栈
{
push(S,a[i]);
i++;
}
else if(a[i] == ')')//如果遇到右括号,不断取出栈顶并输出 直到栈顶为左括号 然后左括号出栈
{
while(peek(S) != '(')
{
printf("%c",pop(S));//将左括号以上所有元素出栈并输出
}
pop(S);//左括号出栈
i++;
}
else //若遇到运算符 只要栈顶符号的优先级大于等于新符号 就不断取出栈顶并输出 最后把新符号进栈 优先级为 :乘除 > 加减 > 左括号
{
if(a[i] == '+' || a[i] == '-')
{
while(!isempty(S) && peek(S) != '(')
{
printf("%c",pop(S));
}
push(S,a[i]);
i++;
}
else if(a[i] == '*' || a[i] == '/')
{
// while(isempty(S) &&(peek(S) == '*' || peek(S) == '/'))
while(!isempty(S) )//忘了加 !
{
if(peek(S) == '*' || peek(S) == '/')
{
printf("%c",pop(S));
}
else
{
break;
}
}
push(S,a[i]);
i++;
}
}
}
while(!isempty(S))
{
//printf("%d",pop(S));//如果注释掉 输入3*(5-7)+6 输出357-*6 如果没注释掉 357-*643 43哪来的???? 写成 %d了
printf("%c",pop(S));
}
return 0;
}
/*
3*(5-7)+6
3栈为空!栈为空!57-64342
*/