C语言问题——“四则运算”程序

来源:百度知道 编辑:UC知道 时间:2024/05/07 01:00:46
我在学习中缀表达式的时候,遇到写一个用于“四则运算的程序。
以下是我的源代码: 通过编译但运行时没答案???
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>//判断字符函数isdigit()包含在其中
#include<string.h>
typedef float DataType;
#include"stack.h"
typedef struct
{
char op;
int inputprecedence;//读入优先级
int stackprecedence;//栈优先级
}DataType1;//运算符栈optr中的元素类型
#include"stack1.h"
DataType1 MathOptr(char ch) //给读入的运算符和左右括号配备优先级
{
DataType1 optr;
optr.op = ch;
switch(optr.op)
{
case'+':
case'-': optr.inputprecedence = 1;
optr.stackprecedence = 1;
break;
case'*':
case'/': optr.inputprecedence = 2;
optr.stackprecedence = 2;
break;
case'(': optr.inputprecedence = 3;
optr.stackprecedence = -1;
break;
case')': optr.inputprecedence = 0;
optr.stackprecedence = 0;
brea

我怀疑你代码的这段有问题:
else if(ch == ')')
{
optr = MathOptr(ch);
while(!Stack1Empty(&OptrStack) && Peek1(&OptrStack).stackprecedence >= optr.inputprecedence) //问题可能在这儿
Evaluate(&OpndStack, Pop1(&OptrStack));
Pop1(&OptrStack);//将栈中的左括号弹出
k++;
ch = str[k];
}
你的左括号的优先级最高,所以当遇到左括号的时候,你的循环并不能退出,Evaluate还会继续计算,然而Evaluate里面的Switch语句里面没有针对'('的分支,所以你看不到任何反馈。要确定是不是这个问题,你可以在Evaluate里面填一条default语句测试一下:
void Evaluate(Stack * OpndStack, DataType1 optr)//执行从运算符栈弹出的运算符optr所要求的运算
{
DataType opnd1,opnd2;
opnd1 = Pop(OpndStack);
opnd2 = Pop(OpndStack);
switch(optr.op)
{
case'+': Push(OpndStack, opnd1+opnd2);
break;
case'-': Push(OpndStack, opnd2-opnd1);
break;
case'*': Push(OpndStack, opnd2*opnd1);
break;
case'/': Push(OpndStack, opnd2/opnd1);
break;
default:
printf("Invalid operator: %c\n", optr.op);
}