traveller_cs 2015-06-11 09:39 采纳率: 100%
浏览 2232
已采纳

请教数据结构后缀表达式 求值问题

要求是:设操作数:0,1,2,……,8,9(可扩充);
运算符:+,—,*,/,(,),#(#号为结束)。
输入中缀表达式,如:5+(4—2)*3 #,将其转换成后缀表达式:542—3*+#,
然后计算,本例结果为11。
需要实现循环输入表达式,我虽然写了do-while却总是无法实现循环,不知道问题出在哪里。
代码如下:
#include
#include
#include
#define Maxsize 100
typedef struct
{
char data[Maxsize]; //存放运算符
int top; //栈顶指针
}operation; //定义运算符栈
void Mid_post(char mid[],char post[])
{
char ch;
int i=0,j=0; //i作为mid的下标,j作为post的下标
operation op;
op.top=-1; //栈置空
ch=mid[i];
i++;
while(ch!='#')
{
switch(ch)
{
case '(': //若ch为左括号,则进栈
op.top++;
op.data[op.top]=ch;
break;
case ')': //若ch为右括号,则出栈,将其中的操作符赋给post[],直到栈顶为左括号
while(op.data[op.top]!='(')
{
post[j++]=op.data[op.top];
op.top--;
}
op.top--; //将栈顶指针减一
break;
case '+':
case '-':
while (op.top!=-1 && op.data[op.top]!='(') //'+'或'-',优先级不大于栈顶任何运算符,栈顶出栈直到栈顶为左括号
{
post[j++]=op.data[op.top];
op.top--;
}
op.top++; //'+'或'-'进栈
op.data[op.top]=ch;
break;
case '*':
case '/':
while(op.top!=-1 && op.data[op.top]!='('
&& (op.data[op.top]=='*' || op.data[op.top]=='/'))//当栈顶运算符为'*'或'/',栈顶出栈,直到栈顶不为'*''/',或遇到左括号
{
post[j++]=op.data[op.top];
op.top--;
}
op.top++;
op.data[op.top]=ch;
break;
case ' ':break;
default:
while(ch>='0' && ch<='9') //判定为数字
{
post[j++]=ch;
ch=mid[i++];
}
i--;
post[j++]='@'; //用'@'标识一个数值串结束
}
ch=mid[i];
i++;
}
while(op.top!=-1)
{
post[j++]=op.data[op.top];
op.top--;
}
post[j]='\0'; //给post表达式添加结束标识
}

struct //数值栈
{
float data[Maxsize]; //存放数值
int top; //栈顶指针
}st;

float Postcount(char post[]) //计算后缀表达式的值
{
float d;
char ch;
int i=0; //i作为post[]的下标
st.top=-1;
ch=post[i];i++;
while(ch!='\0')
{
switch(ch)
{
case '+' : st.data[st.top-1]=st.data[st.top-1] + st.data[st.top];
st.top--;break;
case '-' : st.data[st.top-1]=st.data[st.top-1] - st.data[st.top];
st.top--;break;
case '*' : st.data[st.top-1]=st.data[st.top-1] * st.data[st.top];
st.top--;break;
case '/' : if(st.data[st.top] != 0)
st.data[st.top-1]=st.data[st.top-1] / st.data[st.top];
else
{
printf("\n\t除零错误!\n");
exit(0); //异常退出
}
st.top--;break;
case '@' : st.top--;break;
default:
d=0; //将数字字符转换成对应的数值存放到d中
while(ch>='0' && ch<='9') //判定为数字字符
{
d=10*d+ch-'0';
ch=post[i++];
}
st.top++;
st.data[st.top]=d;
}
ch=post[i++];
}
return st.data[st.top];
}
int main()
{
char p;
char post[100]={0},mid[100]={0};
float x;
do{
gets(mid);
Mid_post(mid,post);
x=Postcount(post);
printf("%f\n",x);
printf("是否继续?\n");
fflush(stdin);
scanf("%c",&p);
}while(p=='Y' || p=='y');
return 0;
}

图片说明

  • 写回答

1条回答

  • 知常曰明 2015-06-11 11:07
    关注

    不会调试啊不会调试。建议大学里专门开一门调试课。
    这个程序没啥大问题。你碰到的是因为回答y之后,直接把控字符串作为下一次的表达式了。解决方法是在scanf之后再用一个fflush就好了。
    另外有点小毛病。用户输入表达式没有以#结束,你也要想办法给个结果啊,哪怕是说“你输入的表达式错误”也是好的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料