我需要帮助,因为我创建的某个程序无法运行,我不知道为什么。我的导师忽略了我的问题。该程序的问题是在将中缀转移到后缀时缺少操作员。提前致谢。顺便说一句,我注意到堆栈的声明类型是long int。但我知道为什么操作符号可以保留在堆栈内,即使操作符号不是整数。如果有人知道这件事,请帮助我。再次感谢。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100
void infixToPostfix(char infix[], char postfix[]);
long int evaluatePostfix(char postfix[]);
int precedence(char symbol);
int power(int b, int a);
long int stack[MAX];
int top = -1;
void push(char symbol);
char pop();
int isEmpty();
main()
{
char infix[MAX], postfix[MAX];
printf("Enter infix expression: ");
gets(infix);
infixToPostfix(infix, postfix);
printf("Postfix expression is : %s\n", postfix);
printf("Value of expression : %ld\n", evaluatePostfix(postfix));
}
void infixToPostfix(char infix[], char postfix[])
{
unsigned int i, p;
char next, symbol;
p = 0;
for (i=0; i<strlen(infix); i++)
{
symbol = infix[i];
if (symbol == ' ' || symbol == '\t')/*ignore blanks and tabs*/
continue;
switch(symbol)
{
case '(':
push(symbol);
break;
case ')':
while ((next = pop()) != '(')
postfix[p++] = next;
break;
case '+':
case '-':
case '*':
case '/':
case '%':
case '^':
while (!isEmpty() && precedence(stack[top]) >= precedence(symbol))
postfix[p++] = pop();
push(symbol);
break;
default:/*operand*/
postfix[p++] = symbol;
}
}
while (!isEmpty())
postfix[p++] = pop();
postfix[p] = '\0';/*Add '\0' to make postfix a string*/
}
int precedence(char symbol)
{
switch(symbol)
{
case '(':
return 0;
case '+':
case '-':
return 1;
case '*':
case '/':
case '%':
return 2;
case '^':
return 3;
default:
return 0;
}
}
long int evaluatePostfix(char postfix[])
{
long int x, y, result;
unsigned int i;
for (i=0; i<strlen(postfix); i++)
{
if (postfix[i] <= '9' && postfix[i] >= '0')
push(postfix[i]-'0');
else
{
x = pop();
y = pop();
switch(postfix[i])
{
case '+':
push(y+x);
break;
case '-':
push(y-x);
break;
case '*':
push(y*x);
break;
case '/':
push(y/x);
break;
case '%':
push(y%x);
break;
case '^':
push(power(y,x));
}
}
}
result = pop();
return result;
}
int power(int b,int a)
{
int i = 1;
if (a = 0)
return 1;
else if (a = 1)
return b;
else if (a > 1)
{
for (i=1; i<a; i++)
b = b * b;
return b;
}
}
void push(char symbol)
{
if (top == MAX-1)
{
printf("Stack Overflow\n");
return;
}
top = top + 1;
stack[top] = symbol;
}
char pop()
{
char x;
if (isEmpty())
{
printf("stack Underflow\n");
exit(1);
}
x = stack[top];
top = top - 1;
return x;
}
int isEmpty()
{
if (top = -1)
return 1;
else
return 0;
}
答案 0 :(得分:2)
isEmpty()
例程中的简单错误:
int isEmpty()
{
printf("top is %d\n", top);
if (top = -1)
return 1;
else
return 0;
}
错误是
if (top = -1)
应该是
if (top == -1)
答案 1 :(得分:1)
您应该在 isEmpty()函数中更改if条件。
替换,
if(top=-1)
通过
if(top==-1)
答案 2 :(得分:1)
之前正确地发现了isEmpty()
中的错误。 if (top = -1)
- &gt; if (top == -1)
正如您自己评论的那样,pow()
在两点发生同样的问题,
if (a = 0)
return 1;
else if (a = 1)
return b;
应该是
if (a == 0)
return 1;
else if (a == 1)
return b;
但是第二次检查是超级的,因为如果你稍微修改它,它将被下面的部分覆盖,修复关于更高功率的错误(每次迭代都给你最后一个的平方)并返回一些{{1}是否定的:
a
我还建议,如果检查上限和下限,则不检查绑定旁边的值是否相等,但绑定上为int power(int b,int a)
{
int i = 1;
int c = b;
if (a == 0)
return 1;
else if (a >= 1)
{
for (i=1; i<a; i++)
c *= b; // meaning c = c * b;
return c;
}
else
return -1;
}
和<
。
因此,如果在某些情况下(可能是在一个更复杂的程序中或者如果你使用浮点数),你没有达到绑定旁边的值,你仍然会中止操作。
if >
- &gt; (top == -1)