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

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

要求是:设操作数: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 易语言把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不能升级的情况