[英]Evaluating an infix expression using stack in c++
这是用于评估中缀表达式的 c++ 代码。当我将中缀表达式直接放入代码中时,我的代码给出了正确的 output 但是当我从用户那里获取表达式然后传递该表达式时,代码没有给出正确的答案,我无法理解为什么。我使用了我的自定义堆栈文件。 如果您能找到我的错误并修复我的代码。 谢谢你。
#include <iostream>
#include"stacklink.h"
#include"stacklink.cpp"
#include<bits/stdc++.h>
using namespace std;
int precedence(char op){
if(op == '+'||op == '-')
return 1;
if(op == '*'||op == '/')
return 2;
return 0;
}
int applyOp(int a, int b, char op){
switch(op){
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b;
}
}
int evaluate(string tokens){
int i;
StackType <int> values;
StackType <char> ops;
for(i = 0; i < tokens.length(); i++){
if(tokens[i] == ' ')
continue;
else if(tokens[i] == '('){
ops.Push(tokens[i]);
}
else if(isdigit(tokens[i])){
int val = 0;
while(i < tokens.length() &&
isdigit(tokens[i]))
{
val = (val*10) + (tokens[i]-'0');
i++;
}
values.Push(val);
}
else if(tokens[i] == ')')
{
while(!ops.IsEmpty() && ops.Top() != '(')
{
int val2 = values.Top();
values.Pop();
int val1 = values.Top();
values.Pop();
char op = ops.Top();
ops.Pop();
values.Push(applyOp(val1, val2, op));
}
if(!ops.IsEmpty())
ops.Pop();
}
else
{
while((!ops.IsEmpty()) && precedence(ops.Top())
>= precedence(tokens[i])) {
int val2 = values.Top();
values.Pop();
int val1 = values.Top();
values.Pop();
char op = ops.Top();
ops.Pop();
values.Push(applyOp(val1, val2, op));
}
ops.Push(tokens[i]);
}
}
while(!ops.IsEmpty()){
int val2 = values.Top();
values.Pop();
int val1 = values.Top();
values.Pop();
char op = ops.Top();
ops.Pop();
values.Push(applyOp(val1, val2, op));
}
return values.Top();
}
int main() {
//cout << evaluate("10 + 2 * 6") << "\n";
//cout << evaluate("10 + 3 * 5 / ( 16 - 4 )") << "\n";
//cout << evaluate("100 * ( 2 + 12 )") << "\n";
//cout << evaluate("100 * ( 2 + 12 ) / 14");
string infix;
cin>>infix;
cout<< evaluate(infix);
return 0;
}
而不是使用cin>>infix使用getline(cin,infix)因为在cin的情况下,它将输入直到 ' ' 或 '\n' 或 '\t' 并且您的字符串包含空格,因此它正在读取直到黑色空间假设您的表达式是10 + 2 ,但它仅将表达式读取为10 。 但是如果你将使用getline那么它将读取整行直到“\n”。
希望它可以帮助......!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.