使用ADT通过包含“stack.h”用户定义的头文件来实现代码。
头文件包含堆栈操作的代码。 由于ASCII转换不正确,我将输出视为奇怪的符号。
我应该在代码中做出哪些更改才能获得正确的输出。
#include<iostream>
#include<string.h>
#include "stack.h"
using namespace std;
void posteva(char postfix[])
{
stack s;
int i=0;
while(postfix[i]!='\0')
{
char x=postfix[i];
if(isdigit(x))
{
s.push(x);
}
else
{
int op1=s.pop();
int op2=s.pop();
int res;
switch(x)
{
case '+':
res=op1+op2;
break;
case '-':
res=op1-op2;
break;
case '*':
res=op1*op2;
break;
case '/':
res=op1/op2;
break;
case '%':
res=op1%op2;
break;
case '^':
res=op1^op2;
break;
}
s.push(res);
}
i++;
}
cout<<"\n\nRESULT :"<<s.pop();
}
int main()
{
char postfix[20];
cout<<"\n\nEnter the postfix : ";
cin>>postfix;
posteva(postfix);
}
答案 0 :(得分:1)
'2'
和'3'
的{{3}}值分别为50
和51
。 50 + 51
为101
,恰好是'e'
的ASCII值。
您正在添加ASCII 编码的值而不是数字。
要将数字转换为int
等效数字,请再次查看该ASCII。在数字方面你不觉得有些模式吗?尝试做例如'3' - '0'
,看看你得到了什么。
当你得到它时,你将得到你的解决方案。
答案 1 :(得分:0)
您的代码存在的问题是您将数字作为字符推送(这是正常的)但您使用它们就像它们是int
一样。如果你只想在堆栈中保留字符,你需要在出路的路上进行转换:
int op1=s.pop() - '0';
int op2=s.pop() - '0';
...
s.push(res + '0');
这种方法存在问题,因为您没有简单的方法来处理多位数字。最好将堆栈转换为整数堆栈,并修改代码以使用多位数输入。
注意: ^
是一个XOR,一个按位操作。由于所有其他操作都是算术运算,我想您希望'^'
表示将op1
提升为op2
的幂。在这种情况下,您应该使用数学库中的pow
函数。