如何修正基于ADT字符栈的后缀表达式求值ASCII转换异常问题?
后缀表达式求值ASCII转换问题修复方案
你遇到的乱码问题,核心原因是数字字符和整数的ASCII转换处理错误——直接把字符形式的数字压入栈,后续用ASCII值做运算,结果自然不对,输出时就会变成乱码。咱们一步步说要改的地方:
1. 数字字符转整数再压栈
你当前的代码里,遇到数字字符直接push(x),但字符'0'-'9'的ASCII值是48-57,不是实际的0-9。所以第一步要把字符转成对应的整数:
if(isdigit(x)) { // 把字符转成整数:字符x减去'0'的ASCII值,得到实际数字 int num = x - '0'; s.push(num); // 注意:这里栈的元素类型需要是int,如果stack.h里栈存的是char,得先改栈的定义 }
2. 运算符处理时用整数运算
后续处理加减乘除等运算符时,从栈里弹出的应该是整数,而不是字符。比如处理加法的话:
else { int a = s.pop(); int b = s.pop(); int res; switch(x) { case '+': res = b + a; break; case '-': res = b - a; break; case '*': res = b * a; break; case '/': res = b / a; break; // 其他运算符同理 } s.push(res); }
3. 最后输出整数而非字符
运算完成后,栈顶的结果是整数,直接输出这个整数就行,别当成字符输出(如果之前用cout << (char)s.top()就会把整数转成ASCII字符,导致乱码):
// 循环结束后输出结果 cout << s.top() << endl;
额外注意:检查栈的存储类型
如果你的stack.h里栈的元素类型是char,那必须改成int——因为整数结果可能超过char的范围(比如两位数以上的结果),而且存字符的话没法正确存储整数数值。
举个简单例子:输入字符'5',直接push的话栈里存的是ASCII 53,转换成5之后push,后续计算3+5的时候,得到的是8而不是53+51=104(对应ASCII的'h',这就是乱码的来源)。
内容的提问来源于stack exchange,提问作者Niraj Wagh
相关产品推荐
相关产品推荐

