递归推动POP POSTFIX计算器无法正确执行操作,只需将最后一个数字作为结果
Recursive Push Pop Postfix Calculator not properly doing operations, simply takes the last number as the result
我有一个我应该做的递归推动POP POSTFIX计算器,而我对此感到困惑的地方是我出了什么问题。我为我的作业所做的唯一有趣的事情是, pop((不返回值,而只是关于它是否能够完成的true/false手术。PEEK用于检索最高号码。我正在使用的数组是存储char的,程序首先说明"请输入表达式:",它应该拿一个字符串。我设置了它,以忽略它的空间,仅接受数字和 - */符号。
int num = 0
int operate(int num)
{
while(!stack.isEmpty()){
if(isdigit(stack.peek()))
{
num = (int) stack.peek() - '0';
stack.pop();
return num;
}
else if(stack.peek() == '+')
{
stack.pop();
return num + operate(num);
}
else if(stack.peek() == '-')
{
stack.pop();
return num - operate(num);
}
else if(stack.peek() == '/')
{
stack.pop();
return num / operate(num);
}
else if(stack.peek() == '*')
{
stack.pop();
return num * operate(num);
}
}
return num;
}
似乎问题是它没有添加任何东西,而只是返回第一个数字。使用标志可以调用正确的次数,但根本不添加,减去,分裂或正确乘以。
输出看起来像
Enter postfix expression: 1 2 +
Pushing 1
Pushing 2
Pushing +
Result: 2
Done? Yes/No: No
Enter postfix expression: 2 2 +
Pushing 2
Pushing 2
Pushing +
Result: 2
Done? Yes/No: No
Enter postfix expression: 1 1 -
Pushing 1
Pushing 1
Pushing -
Result: -1
Done? Yes/No: No
Enter postfix expression: 2 2 *
Pushing 2
Pushing 2
Pushing *
Result: 2
我知道我的问题是我的思维方式,但是根据我的教科书,这应该是正确的。
二进制运算符具有两个操作数。例如,在+
上,您需要弹出两个值,添加它们,然后按结果。请注意,对于扣除和分割,操作数不会按正确的顺序推动:您必须交换它们。
'推 '是毫无意义的。
您不需要递归。您已经有一个堆栈,甚至通过将所有输入推入其中来滥用它。该堆栈用于中间和最终结果。后缀是一种线性符号,可以用比中间结果的堆栈更复杂地执行的线性符号,但是 start 没有堆栈中没有任何意义。输入只是操作数和操作员的线性列表。
说您正在用
来称呼它return operate(num);
您有一个堆栈:22
第一次会弹出 堆栈。
else if(stack.peek() == '+')
{
stack.pop();
return 0 + operate(0); // and do this
}
第二次会从堆栈中弹出2个,然后做到这一点,
if(isdigit(stack.peek()))
{
num = (int) stack.peek() - '0'; // num = 2
stack.pop(); // 2 is popped
return num; // return 2
}
和walla,您有2个结果。
我能够找出答案,我在操作语句中找到了第一个数字,但没有任何其他数字。
正确的代码略有不同
int operate(int num)
{
while(!stack.isEmpty()){
if(isdigit(stack.peek()))
{
num = (int) stack.peek() - '0';
stack.pop();
return num;
}
else if(stack.peek() == '+')
{
stack.pop();
return operate(num) + operate(num);
}
else if(stack.peek()== '-')
{
stack.pop();
return operate(num) - operate(num);
}
else if(stack.peek() == '/')
{
stack.pop();
return operate(num) / operate(num);
}
else if(stack.peek() == '*')
{
stack.pop();
return operate(num) * operate(num);
}
}
return num;
}
相关文章:
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 我必须更改我的数字最后一个数字和第一个数字,但不要使用仅带有整数或循环的函数.例如从 12345 到 52341
- 带有文件结束函数的 while 循环重复输出文件中的最后一个数字两次
- 递归推动POP POSTFIX计算器无法正确执行操作,只需将最后一个数字作为结果
- 代码问题.使用矢量删除相同的数字,除了它的最后一个入口
- C++:对数组进行排序,最后一个数字重复两次
- C++ - 查找数组中第一个和最后一个负数之间的数字
- 我不想要最后一个数字/值后面的逗号,如何删除它(c ++,循环)
- 如何删除C++中浮点数的最后一个有效数字/尾数位
- 逐行计算文件:EOF 重复最后一个数字(不能使用中断)
- 如何确定浮点数中的最后一个非零十进制数字
- 为什么我可以索引到数字超出范围的三维数组中,但仍然可以访问数组中的最后一个数字
- 无法显示 for 循环后的最后一个数字
- 不能算出这个按数字顺序打印数字的c++小程序的最后一个
- 查找升序列表中降序的第一个和最后一个数字
- 冒泡排序不排序最后一个数字与此算法
- 排序程序仅显示第一个和最后一个数字
- 如何在读取文本文件时跳到每行最后一个数字之后的下一行
- 为什么 C++ 中的编译器不增加循环中最后一个数字的值?
- 把最后一个数字切掉,做成双份