2 traveller cs traveller_cs 于 2015.06.11 17:39 提问

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

要求是:设操作数: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个回答

gamefinity
gamefinity   Rxr 2015.06.11 19:07
已采纳

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

traveller_cs
traveller_cs 嗯,就是,程序错了不会调试。按你说的做果然行了。我们老师也确实是要求要对错误的输入做处理,所以还没写完,多谢了。
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片