在dev c++和vc++中,均能通过编译,但无法正常运行,似乎是陷入死循环,但经检查逻辑没有错误,如何修改才能使其正常输出结果?
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef char stackelm;
struct stack
{
stackelm * top;
stackelm * base;
int stacksize;
};
void init(stack &s) //初始化栈
{
s.base = (stackelm*)malloc(100*sizeof(stackelm));
s.top = s.base;
int stacksize = 100;
}
bool stackempty(stack s) //栈是否为空
{
if (s.top==s.base)
return true;
else
return false;
}
void push(stack &s, stackelm e) //入栈操作
{
*s.top = e;
*s.top++;
}
stackelm gettop(stack s, stackelm &e) //显示栈顶元素
{
if(s.top>s.base)
{
e = *(s.top-1) ;
return 0;
}
else
return -1;
}
stackelm pop(stack &s, stackelm &e) //出栈操作
{
if (stackempty(s)==false)
{
e = *(s.top-1);
*s.top--;
}
else
return 1;
}
char precede(stackelm t1, stackelm t2) //判断t1 t2 两符号的优先级关系
{
char f;
switch (t2)
{
case '+':
case '-':
if (t1 == '(' || t1 == '\n')
f = '<';
else
f = '>';
break;
case '*':
case '/':
if (t1 == '*' || t1 == '/' || t1 == ')')
f = '>';
else
f = '<';
break;
case '(':
if (t1 == ')')
{
printf("括号不匹配\n");
exit (-1);
}
else
f = '<';
break;
case ')':
switch (t1)
{
case '(':
f = '=';
break;
case '\n':
printf("缺少左括号\n");
exit (-1);
break;
default:
f = '>';
}
case '\n':
switch (t1)
{
case '\n':
f = '=';
break;
case '(':
printf("缺少右括号\n");
exit (-1);
break;
default:
f = '>';
}
return f;
}
}
bool in(stackelm c) //判断是否为七种运算符之一
{
switch (c)
{
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '\n':
return true;
default:
return false;
}
}
stackelm operate(stackelm a, stackelm x, stackelm b)//进行四则运算
{
switch (x)
{
case '+':
return a+b;
case '-':
return a-b;
case '*':
return a*b;
case '/':
return a/b;
}
}
stackelm evaluateexpression()//调用上面的函数进行表达式求值
{
stack OPTR, OPND; //OPTR存放运算符,OPND存放运算数
stackelm a,b,c,x;
init(OPTR);
init(OPND);
push(OPTR,'\n');
c = getchar();
gettop(OPTR,x);
while (c!='\n'||x!='\n') //使用循环来求值
{
if (in(c))
switch (precede(x,c))
{
case '<':
push(OPTR,c);
c = getchar();
break;
case '=':
pop(OPTR,x);
c = getchar();
break;
case '>':
pop(OPTR,x);
pop(OPND,b);
pop(OPND,a);
push(OPND,operate(a,x,b));
}
else if (c >= '0' && c <= '9')
{
push(OPND,c-48);
c = getchar();
}
else
{
printf("非法字符\n");
exit (-1);
}
gettop(OPTR,x);
}
pop(OPND,x);
if(!stackempty(OPND))
{
printf("表达式不正确\n");
exit (-1);
}
return x; //x为输入表达式的最终运算结果
}
int main()
{
printf("%d",evaluateexpression());
}