无法找出我的代码中的逻辑错误
Not able to figure out the logical error in my code
我的代码中存在一些逻辑错误,但我无法弄清楚是什么。当我 运行 我的代码没有给我想要的结果时。
输出:
Enter an infix expression
2+3
2
我得到 2 作为我的后缀表达式,而我应该得到 23+。
请看看是否有人可以帮我解决这个问题。
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<ctype.h>
#define max 20
int top=-1;
char infix[max],postfix[max],stack[max];
char pop();
int empty();
void push(char );
int precedence(char );
void infix_to_postfix(char * ,char * );
void main()
{
clrscr();
printf("Enter an infix expression\n");
gets(infix);
infix_to_postfix(infix,postfix);
printf("%s",postfix);
getch();
}
void infix_to_postfix(char infix[max],char postfix[max])
{
int i=0,j=0;
char value,x;
for(i=0;infix[i]!='[=11=]';i++)
{
value=infix[i];
if(isalnum(value))
{
postfix[j]=value;
j++;
}
else
{
if(value=='(')
push('(');
else
{
if(value==')')
{
while((x=pop())!='(')
{
postfix[j]=x;
j++;
}
}
else
{
while(precedence(value)<=precedence(stack[top])&&!empty())
{
x=pop();
postfix[j]=x;
j++;
}
push(value);
}
}
}
}
while(!empty())
{
x=pop();
postfix[j]=x;
j++;
}
postfix[j]='[=11=]';
}
void push(char x)
{
if(top==max-1)
printf("stack overflow\n");
else
{
top++;
stack[top]=x;
}
}
char pop()
{
char x;
x=stack[top];
top--;
return x;
}
int empty()
{
if(top==-1)
return(0);
return(1);
}
int precedence(char value)
{
if(value=='(')
return(0);
if(value=='+'||value=='-')
return(1);
if(value=='*'||value=='/'||value=='%')
return(2);
return(3);
}
您需要做的就是更改您的 empty()
功能
您在 if 条件下检查 !empty()
,但您 returning 为 0,当它为空时,这将使条件为真,即 Stack 不为空。如果堆栈为空,请将 return 值更改为 1。
一般来说,除了 empty()
函数中的 return 值错误外,您的代码逻辑没有问题。
在empty()
中,当堆栈为空时,它应该是return 1。
int empty(){
if(top==-1)
return(0); <-- !!! here should return 1
}
否则,
- 即使堆栈为空,它也会在
while(precedence(value)<=precedence(stack[top])&&!empty())
处进入 while 循环。
- 然后
postfix[j] = x
可能会写一个冗余的0
(现在top=-2)到postfix
数组。
- 最后,在输入
2+3
下,postfix[]
会变成{'2','[=21=]','3','+',...}
,导致异常输出2
。
所以,修改empty()
函数后就可以了,比如
int empty()
{
if(top==-1)
return(1); // not return(0)
return(0);
}
输出:
Enter an infix expression
2+3
23+
我的代码中存在一些逻辑错误,但我无法弄清楚是什么。当我 运行 我的代码没有给我想要的结果时。
输出:
Enter an infix expression
2+3
2
我得到 2 作为我的后缀表达式,而我应该得到 23+。 请看看是否有人可以帮我解决这个问题。
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<ctype.h>
#define max 20
int top=-1;
char infix[max],postfix[max],stack[max];
char pop();
int empty();
void push(char );
int precedence(char );
void infix_to_postfix(char * ,char * );
void main()
{
clrscr();
printf("Enter an infix expression\n");
gets(infix);
infix_to_postfix(infix,postfix);
printf("%s",postfix);
getch();
}
void infix_to_postfix(char infix[max],char postfix[max])
{
int i=0,j=0;
char value,x;
for(i=0;infix[i]!='[=11=]';i++)
{
value=infix[i];
if(isalnum(value))
{
postfix[j]=value;
j++;
}
else
{
if(value=='(')
push('(');
else
{
if(value==')')
{
while((x=pop())!='(')
{
postfix[j]=x;
j++;
}
}
else
{
while(precedence(value)<=precedence(stack[top])&&!empty())
{
x=pop();
postfix[j]=x;
j++;
}
push(value);
}
}
}
}
while(!empty())
{
x=pop();
postfix[j]=x;
j++;
}
postfix[j]='[=11=]';
}
void push(char x)
{
if(top==max-1)
printf("stack overflow\n");
else
{
top++;
stack[top]=x;
}
}
char pop()
{
char x;
x=stack[top];
top--;
return x;
}
int empty()
{
if(top==-1)
return(0);
return(1);
}
int precedence(char value)
{
if(value=='(')
return(0);
if(value=='+'||value=='-')
return(1);
if(value=='*'||value=='/'||value=='%')
return(2);
return(3);
}
您需要做的就是更改您的 empty()
功能
您在 if 条件下检查 !empty()
,但您 returning 为 0,当它为空时,这将使条件为真,即 Stack 不为空。如果堆栈为空,请将 return 值更改为 1。
一般来说,除了 empty()
函数中的 return 值错误外,您的代码逻辑没有问题。
在empty()
中,当堆栈为空时,它应该是return 1。
int empty(){
if(top==-1)
return(0); <-- !!! here should return 1
}
否则,
- 即使堆栈为空,它也会在
while(precedence(value)<=precedence(stack[top])&&!empty())
处进入 while 循环。 - 然后
postfix[j] = x
可能会写一个冗余的0
(现在top=-2)到postfix
数组。 - 最后,在输入
2+3
下,postfix[]
会变成{'2','[=21=]','3','+',...}
,导致异常输出2
。
所以,修改empty()
函数后就可以了,比如
int empty()
{
if(top==-1)
return(1); // not return(0)
return(0);
}
输出:
Enter an infix expression
2+3
23+