运算符在尝试将中缀表达式转换为后缀表达式时未插入 C 中的堆栈
Operators not inserting in the stack in C while trying to convert an infix expression to a postfix one
我正在尝试实现一个中缀到后缀 的转换程序。在执行代码时,我只能看到字母数字字符。算术运算符不打印。调试时,我发现运算符没有插入堆栈。我找不到这背后的原因。
感谢任何帮助。
#include<stdio.h>
#include <ctype.h>
#define MAX 50
char st[MAX];
int top = -1;
void push(char);
char pop();
int priority(char);
int main()
{
int i=0;
char x,s[50];
printf("Enter infix expression: ");
gets(s);
while(s[i]!='[=10=]')
{
if(isalnum(s[i]))
printf("%c",s[i]);
else if(s[i] == '(')
push(s[i]);
else if(s[i] == ')')
{
while((x=pop())!='(')
printf("%c",x);
}
else
{
while(priority(st[top])>=priority(s[i]))
printf("%c",pop());
push(st[i]);
}
i++;
}
while(top!=-1)
printf("%c",pop());
}
void push(char x)
{
st[++top] = x;
}
char pop()
{
if(top == -1)
return -1;
else
return (st[top--]);
}
int priority(char x)
{
if(x == '(')
return 0;
if(x == '+' || x == '-')
return 1;
if(x == '*' || x == '/' || x == '%')
return 2;
}
正如您在调试会话中正确检测到的那样,您在 postfix 表达式中看不到运算符,因为您从未 push()
将它们添加到堆栈中。
事实上
- 在第一个
if
中检查字母数字字符
- 在下面的
else if
中检查左括号
- 在第二个
else if
中检查右括号
- 在最后的 else 中,您从堆栈管理
pop
s...但您没有推送任何东西! (1)
您需要解决的是最后一个 else
,您至少有两个明显的问题:
- 您在未检查
top
值的情况下访问 st[top]
。您需要管理 top = -1
的情况,这将导致堆栈数组的越界访问和未定义的行为。我认为在那种情况下你只需要按下 operator
- 您压入堆栈
st[i]
。可能你的意思是 s[i]
这样while分析表达式就变成了
while(s[i]!='[=10=]')
{
if(isalnum(s[i]))
printf("%c ",s[i]);
else if(s[i] == '(' )
push(s[i]);
else if(s[i] == ')')
{
while((x=pop())!='(')
printf("%c ",x);
}
else
{
if( top != -1 )
{
while(priority(st[top])>=priority(s[i]))
printf("%c ",pop());
}
push(s[i]);
}
i++;
}
输入:
4*6+3
输出:
4 6 * 3 +
(为了提高输出的可读性,我在 printf
中的每个 %c
之后又添加了一个 space。
注意:运营商优先级管理中的一些问题还需要修复
我正在尝试实现一个中缀到后缀 的转换程序。在执行代码时,我只能看到字母数字字符。算术运算符不打印。调试时,我发现运算符没有插入堆栈。我找不到这背后的原因。
感谢任何帮助。
#include<stdio.h>
#include <ctype.h>
#define MAX 50
char st[MAX];
int top = -1;
void push(char);
char pop();
int priority(char);
int main()
{
int i=0;
char x,s[50];
printf("Enter infix expression: ");
gets(s);
while(s[i]!='[=10=]')
{
if(isalnum(s[i]))
printf("%c",s[i]);
else if(s[i] == '(')
push(s[i]);
else if(s[i] == ')')
{
while((x=pop())!='(')
printf("%c",x);
}
else
{
while(priority(st[top])>=priority(s[i]))
printf("%c",pop());
push(st[i]);
}
i++;
}
while(top!=-1)
printf("%c",pop());
}
void push(char x)
{
st[++top] = x;
}
char pop()
{
if(top == -1)
return -1;
else
return (st[top--]);
}
int priority(char x)
{
if(x == '(')
return 0;
if(x == '+' || x == '-')
return 1;
if(x == '*' || x == '/' || x == '%')
return 2;
}
正如您在调试会话中正确检测到的那样,您在 postfix 表达式中看不到运算符,因为您从未 push()
将它们添加到堆栈中。
事实上
- 在第一个
if
中检查字母数字字符 - 在下面的
else if
中检查左括号 - 在第二个
else if
中检查右括号 - 在最后的 else 中,您从堆栈管理
pop
s...但您没有推送任何东西! (1)
您需要解决的是最后一个 else
,您至少有两个明显的问题:
- 您在未检查
top
值的情况下访问st[top]
。您需要管理top = -1
的情况,这将导致堆栈数组的越界访问和未定义的行为。我认为在那种情况下你只需要按下 operator - 您压入堆栈
st[i]
。可能你的意思是s[i]
这样while分析表达式就变成了
while(s[i]!='[=10=]')
{
if(isalnum(s[i]))
printf("%c ",s[i]);
else if(s[i] == '(' )
push(s[i]);
else if(s[i] == ')')
{
while((x=pop())!='(')
printf("%c ",x);
}
else
{
if( top != -1 )
{
while(priority(st[top])>=priority(s[i]))
printf("%c ",pop());
}
push(s[i]);
}
i++;
}
输入:
4*6+3
输出:
4 6 * 3 +
(为了提高输出的可读性,我在 printf
中的每个 %c
之后又添加了一个 space。
注意:运营商优先级管理中的一些问题还需要修复