中缀反向波兰符号
Infix to reverse polish notation
我正在编写将中缀表达式转换为反向表示法的代码,但我的程序在执行文件时崩溃了
typedef struct stack
{
char a[400];
int top;
}
stack;
stack s;
void push(char *,int);
int pop();
int main()
{
char x[400];
int len,i,y;
puts("Enter string");
scanf("%s",x);
len=strlen(x);
for(i=0;i<len;i++)
{
//considering user is entering only the small alphabets
if((x[i])>=97&&x[i]<=122)
printf("%s",x[i]);
else
//if encountering the operator then pushing it into stack
if(x[i]=='/'||x[i]=='*'||x[i]=='+'||x[i]=='-')
{
push(x,i);
}
else if(x[i]=='(')
continue;
//When encountering the ')' then popping the operator
else
{
y=pop();
printf("%c",y);
}
}
return 0;
}
传递数组及其大小作为参数
void push(char *x,int i)
{
stack s;
s.top++;
s.a[s.top]=x[i];
}
找到“)”后返回弹出的运算符
int pop()
{
stack s;
int temp;
temp=s.a[s.top];
s.top--;
return temp;
}
在你的代码中
printf("%s",x[i]);
错了。你要的是
printf("%c",x[i]);
按照 C11
标准,章节 7.21.6.1
,%s
格式说明符
If no l length modifier is present, the argument shall be a pointer to the initial
element of an array of character type. ...
但是这里 x[i]
是类型 char
.
此外,从第 9 段开始,
If any argument is
not the correct type for the corresponding conversion specification, the behavior is
undefined.
因此,您的代码调用 undefined behaviour.
接下来,对于 push()
和 pop()
这两个函数,您要定义一个局部变量 stack s
;它在每次调用这些函数时创建,并在完成执行时销毁。您可能想改用 gloabl 变量。删除局部变量,不需要它们。
此外,对于这两个函数,您使用 s.top
值作为 s.a
数组的索引,但没有对其进行任何边界检查。在使用 s.top
值作为索引之前,您应该检查堆栈满情况 (push()
) 和堆栈空情况 (pop()
) 的数组索引值。 s.top
的自增自减也要放在检查下。
编辑:
对于逻辑部分,在解析完所有的输入后,你应该检查堆栈中是否还有要弹出的元素。您应该 打印 堆栈 containts 直到堆栈变空以获得 complete 符号。查看我下面的评论以了解伪代码的想法。
注意:根据C
标准,int main()
应该是int main(void)
我正在编写将中缀表达式转换为反向表示法的代码,但我的程序在执行文件时崩溃了
typedef struct stack
{
char a[400];
int top;
}
stack;
stack s;
void push(char *,int);
int pop();
int main()
{
char x[400];
int len,i,y;
puts("Enter string");
scanf("%s",x);
len=strlen(x);
for(i=0;i<len;i++)
{
//considering user is entering only the small alphabets
if((x[i])>=97&&x[i]<=122)
printf("%s",x[i]);
else
//if encountering the operator then pushing it into stack
if(x[i]=='/'||x[i]=='*'||x[i]=='+'||x[i]=='-')
{
push(x,i);
}
else if(x[i]=='(')
continue;
//When encountering the ')' then popping the operator
else
{
y=pop();
printf("%c",y);
}
}
return 0;
}
传递数组及其大小作为参数
void push(char *x,int i)
{
stack s;
s.top++;
s.a[s.top]=x[i];
}
找到“)”后返回弹出的运算符
int pop()
{
stack s;
int temp;
temp=s.a[s.top];
s.top--;
return temp;
}
在你的代码中
printf("%s",x[i]);
错了。你要的是
printf("%c",x[i]);
按照 C11
标准,章节 7.21.6.1
,%s
格式说明符
If no l length modifier is present, the argument shall be a pointer to the initial element of an array of character type. ...
但是这里 x[i]
是类型 char
.
此外,从第 9 段开始,
If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.
因此,您的代码调用 undefined behaviour.
接下来,对于 push()
和 pop()
这两个函数,您要定义一个局部变量 stack s
;它在每次调用这些函数时创建,并在完成执行时销毁。您可能想改用 gloabl 变量。删除局部变量,不需要它们。
此外,对于这两个函数,您使用 s.top
值作为 s.a
数组的索引,但没有对其进行任何边界检查。在使用 s.top
值作为索引之前,您应该检查堆栈满情况 (push()
) 和堆栈空情况 (pop()
) 的数组索引值。 s.top
的自增自减也要放在检查下。
编辑:
对于逻辑部分,在解析完所有的输入后,你应该检查堆栈中是否还有要弹出的元素。您应该 打印 堆栈 containts 直到堆栈变空以获得 complete 符号。查看我下面的评论以了解伪代码的想法。
注意:根据C
标准,int main()
应该是int main(void)