weixin_43510475 2018-10-24 14:51 采纳率: 0%
浏览 1114

C语言小白 编译运行无误。求大神看一下为什么最后运行时输入等号回车后没有结果?

#include
#include
#include
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define MAXSIZE 100
typedef char DataType;

typedef struct
{
DataType data[MAXSIZE];
int top;
}SqStack;

int InitStack(SqStack &S)
{ //构造一个空栈
S.top= -1;
return 1;
}

int StackEmpty(SqStack S)
//判栈为空栈时返回值为真,反之为假
{ return(S.top==-1? TRUE:FALSE);}

int StackFull(SqStack S)
//判栈为满栈时返回值为真,反之为假
{ return(S.top==MAXSIZE-1?TRUE:FALSE);}

int Push(SqStack &S, DataType e)
{ //将元素e插入到栈中,作为的新栈顶
if(StackFull(S)) return ERROR; //栈满
S.top++; // top加1,栈顶位置上移
S.data[S.top]=e; //数据e存入当前栈顶
return 1;
}

int Pop(SqStack &S,DataType &e)
{//若栈不为空,则删除栈顶元素
if(StackEmpty(S)) return ERROR; //栈空
e=S.data[S.top]; //取出数据放入e所指单元中
S.top--; // top减1,栈顶位置下移
return 1;
}

DataType GetTop(SqStack S)
{//若栈不为空,则取栈顶元素
DataType e;
if(StackEmpty(S)) return ERROR; //栈空
e=S.data[S.top]; //取出数据,top不变
return e;
}

typedef char DataType;
int bracketmatching()
{
SqStack S;
DataType ch;
InitStack(S);
while ((ch=getchar())!='\n')
{
switch (ch) //遇左括号入栈;遇到右括号时,分别检测匹配情况
{
case '(':
case '[':
case '{':
Push(S,ch);break;

case  ')':
    if (StackEmpty(S)) return FALSE; 
    else 
    { Pop(S,ch);  if (ch!= '(') return FALSE; }
    break;

case ']':
    if (StackEmpty(S)) return FALSE;
    else 
    { Pop(S,ch);   if (ch!= '[') return FALSE; }
    break;

case '}':
    if (StackEmpty(S)) return FALSE;
    else
    { Pop(S,ch);  if (ch!='{') return FALSE; }
    break;
    default:break;
  }
}
if (StackEmpty(S)) return TRUE;
else return FALSE;

}

int In(char ch) /*判断字符ch是否为算符*/
{
int i,flag=0;
char op[7]={'+','-','*','/','(',')','='}; /*算符数组*/
for (i=0;i<7;i++)
if(ch==op[i])
{
flag=1;
break;
}
return flag;
}
DataType Operate(DataType a,char theta,DataType b)
{ DataType z;
switch (theta)
{
case '+':z=a+b;break;
case '-':z=a-b;break;
case '*':z=a*b;break;
case '/':z=a/b;break;
}
return(z);
}

char Precede (char a,char b) /*比较两个运算符的优先级*/
{
char z;
if((b=='+')||(b=='-')||(b=='*')||(b=='/')|| (b=='(')||(b==')') ||(b=='='))
switch (a)
{case '+':
case '-':
if((b=='*')||(b=='/')||(b=='(')) z='<';
else z='>'; break;
case '*':
case '/':
if(b=='(') z='<';
else z='>';break;
}
return z;
}

float CaculateExpression(char *str)
{ //算术表达式求值的算符优先算法。设optr和opnd分别为算符栈和操作数栈,
//OP为算符集合
char a,b,theta,x,u;
SqStack optr,opnd;
char *p;
int k;

InitStack(optr);
Push(optr, '=');
InitStack(opnd);
p=str;//c=getchar();
while(*p!='=' ||GetTop(optr)!='=')
{
if(!In(*p))
{
u=0;
k=0;//统计小数位数
while(*p>='0'&&*p<='9'||*p=='.')
{
if(*p!='.')u=u*10+*p-'0';
if(*p=='.'||k>0) k++;
p++;
}

  if(k>0) u=u/pow(10,k-1);
  Push(opnd,u);

} //不是算符则进栈
else
switch(Precede(GetTop(optr),*p))
{ case '<' : //栈顶算符优先级低
Push(optr,*p);
p++;//c=getchar();
break;
case '=' : //优先级相同,脱去括号并读入下一字符
Pop(optr,x);
p++;//c=getchar();
break;
case '>' : //栈顶算符优先级高,退栈并将运算结果入栈
Pop(optr,theta);
Pop(opnd,b);Pop(opnd,a);
Push(opnd,Operate(a,theta,b));
break;
}}
return GetTop(opnd);
}

int JudgeExpression(char *str)
{
char*p;
p=str;
while(*p!='\0') p++;
p--;
if(*p!='=')
{
printf("表达式要以等号结束!");
return 0;
}
return 1;
}

int main()
{
char str[81];
printf("请输入表达式:");
scanf("%s",str);
if(JudgeExpression(str))
printf("%s%f\n",str,CaculateExpression(str));
return 0;
}

  • 写回答

1条回答 默认 最新

  • Italink 2018-10-24 15:00
    关注

    在CaculateExpression函数中的while循环中,是不是忘记对p进行操作了,p一直没改变,在这里是死循环

     while (*p != '=' || GetTop(optr) != '=')
        {
            if (!In(*p))
            {
                u = 0;
                k = 0;//统计小数位数
                while (*p >= '0'&&*p <= '9' || *p == '.')
                {
                    if (*p != '.')u = u * 10 + *p - '0';
                    if (*p == '.' || k>0) k++;
                    p++;
                }
                if (k>0) u = u / pow(10, k - 1);
                Push(opnd, u);
            } //不是算符则进栈
            else
                switch (Precede(GetTop(optr), *p))
                {
                case '<': //栈顶算符优先级低
                    Push(optr, *p);
                    p++;//c=getchar();
                    break;
                case '=': //优先级相同,脱去括号并读入下一字符
                    Pop(optr, x);
                    p++;//c=getchar();
                    break;
                case '>': //栈顶算符优先级高,退栈并将运算结果入栈
                    Pop(optr, theta);
                    Pop(opnd, b); Pop(opnd, a);
                    Push(opnd, Operate(a, theta, b));
                    break;
                }
        }
    
    评论

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况