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就好了。
    另外有点小毛病。用户输入表达式没有以#结束,你也要想办法给个结果啊,哪怕是说“你输入的表达式错误”也是好的。

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

报告相同问题?

悬赏问题

  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同