我的代码运行得很好! 唯一的问题是,无论何时我使用括号中缀输入,它都会出现一个' J'在后缀表达结束!!有什么建议?? 这里的算法是所有表达式都被转换的基本算法,所有这些都是正确的,但尾随的是J'我只是不明白!!建议??
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define MAX 50
char stack[MAX];
int top = -1;
void push(char element)
{
stack[++top] = element;
}
char pop()
{
return(stack[top--]);
}
char tope()
{
return(stack[top]);
}
int prec(char c)
{
switch(c){
case '+':
case '-' : return 1;
break;
case '*' :
case '/' : return 2;
break;
default:
return 0;
break;
}
}
int main()
{
char post[MAX],in[MAX],ch,element;
printf("Infix expression : ");
scanf("%s",in);
int i=0,k=0;
in[strlen(in)] = ')';
push('(');
while((ch = in[i++]) != '\0')
{
if(isalnum(ch))
post[k++] = ch;
if(ch == '(')
push(ch);
if(ch == ')')
{
while(tope() != '(')
{
post[k++] = pop();
}
pop();
}
if(ch == '+' || ch =='-' || ch == '*' || ch == '/')
{
while(prec(ch) <= prec(tope()))
{
post[k++] = pop();
}
push(ch);
}
}
post[k] = '\0';
printf("%s",post);
return 0;
}
答案 0 :(得分:2)
in[strlen(in)] = ')';
覆盖了nul-terminating字符,它解释了打印时出现的奇怪字符(打印只有在运气时遇到另一个nul字符时停止:未定义的行为,如果在in
中找不到空字符,甚至可能导致崩溃50字节缓冲区)
你必须改变它,例如:
int l = strlen(in);
in[l] = ')';
in[l+1] = '\0';
注意: 要将字符串的长度存储在l
中,而不是两次调用strlen(in)
,这不仅是因为性能损失,而是因为括号表示在{null-terminate>之前strlen
无法正常工作。
(您也可能希望像scanf
这样保护scanf("%48s",in);
,这样您就可以确保有足够的空间容纳50个大小的缓冲区的额外括号,甚至可以与您的宏定义兼容,见scanf: template with macro (#define constant) inside)