如何正确显示此堆栈的内容?
How can I properly display the contents of this stack?
我一直在尝试获取已经从中缀转换的后缀字符串并对其进行评估以显示其正确的值。这是我解析后缀字符串并将数字放入堆栈(int 值的 postStack (的方法:
for (int i = 0; i < post.length(); i++)
{
int result;
if (isdigit(post[i]))
{
int j = post[i] - '0';
postStack.push(j);
continue;
}
else
{
token = post[i]; //token = char type;
int num2 = postStack.top(); postStack.pop();
int num1 = postStack.top(); postStack.pop();
result = evaluate(num1, token, num2);
postStack.push(result);
continue;
}
}
这是接收数字和运算符的赋值方法:
int evaluate(int num1, char token, int num2)
{
int result = 0;
switch (token)
{
case '+': result = num1 + num2;
case '-': result = num1 - num2;
case '*': result = num1 * num2;
case '^': result = (int)(pow(num1, num2) + 0.5);
}
return result;
}
打印时我从中收到的输出是大的负数或零。我在这里错过了什么?输出:
1: 2 + 3 * 5
235*+
-2147483648
2: 2 + 3 * 5 ^ 6
2356^*+
0
3: 2 + 3 - 5 + 6 - 4 + 2 - 1
23+5-6+4-2+1-
-2147483647
4: 2 + 3 * (5 - 6) - 4
2356-*+4-
0
5: 2 * 3 ^ 5 * 6 - 4
235^*6*4-
-2147483648
6: (2 + 3) * 6 ^ 2
23+62^*
-2147483648
这是我用来打印堆栈的内容:
while (!postStack.empty())
{
int itemp = postStack.top(); postStack.pop();
cout << itemp;
}
cout << endl << endl;
您的switch
在每次case
后都缺少一个break
。它陷入低谷并执行超出第一个匹配的 case 语句的每个 case 语句。意思是说到底你总是在计算num1
的力量来num2
。这给了你荒谬的高数字,不适合一个 int 并且你得到溢出,因此 int 变成负数。
例如,输入"235*+"实际上计算2 ^ (3 ^ 5( = 2 ^ 243。但是 int 最多只能保存 2 ^ 31 - 1 的值。
您在case
块中的每个块中都缺少break
语句。
#include <bits/stdc++.h>
using namespace std;
int evaluate(int num1, char token, int num2){
int result = 0;
switch (token){
case '+': result = num1 + num2; break;
case '-': result = num1 - num2; break;
case '*': result = num1 * num2; break;
case '^': result = (int)(pow(num1, num2) + 0.5); break;
}
return result;
}
int main(){
string post = "2356^*+";
stack<int> postStack;
for (int i = 0; i < post.length(); i++){
int result;
if (isdigit(post[i])){
int j = post[i] - '0';
postStack.push(j);
}
else{
char token = post[i]; //token = char type;
int num2 = postStack.top(); postStack.pop();
int num1 = postStack.top(); postStack.pop();
result = evaluate(num1, token, num2);
postStack.push(result);
}
}
cout << postStack.top() <<endl;
}
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- CMake-按正确顺序将项目与C运行时对象文件链接
- 并发安全堆栈接口方法:正确与否?
- 如何正确显示此堆栈的内容?
- 打开C++故障转储不会在调用堆栈中显示正确的行
- 当外部源代码中发生异常时,无法正确使用自创建的小型转储文件的堆栈跟踪
- 如何使用ABI调用过程在堆栈上正确传递Float参数
- 在我的实现中使用堆栈是否正确?
- 从堆栈中读取字符后,如何修复不正确的文件输出
- 如何正确打印堆栈的向量
- C 程序用于使用堆栈检查正确的HTML标签
- C++:在堆栈中实例化类的正确方法是什么
- 无堆栈协程与堆叠协程有何不同
- 堆栈超出范围.也许没有正确地称呼它
- 什么是堆栈?arrayStack ?arrayQueue ?堆栈队列 ?它们在C++上有何不同
- 无锁堆栈-这是c++11宽松原子的正确用法吗?它能被证明吗
- std::vectors中的vector取消分配其shared_ptr内容(堆栈实体对象的使用不正确?)
- 堆栈和子类之间的正确UML关系是什么
- C++标准对堆栈溢出有何规定
- 为什么此堆栈无法正确显示?