python中缀式求值_中缀表达式求值的方法—栈

对于像是1+2的中缀表达式,我们可以轻松地运用代码来算出结果。

但是对于1+(2^2)/3*4这样的表达式,事情就变得有些复杂了...

对于上述的表达式,我们可以运用栈的相关知识来解决—建立两个栈,栈1放数字,栈2放运算符;遇到数字时入栈1;遇到运算符时,若栈2为空,则pop出栈1中的两个数运算,将运算完的结果压入栈1;若栈2非空,则将当前运算符与栈2中栈顶的运算符进行比较优先级,再进行下一步操作。代码如下:

#include

#include

#include

#include

#define Maxsize 50

using namespace std;

stack S1;

stack S2;

void Calculate(char a)

{

int b,c,d=0;

if(a=='+'){

b=S1.top();

S1.pop();

c=S1.top();

S1.pop();

d=c+b;

S1.push(d);

}

if(a=='-'){

b=S1.top();

S1.pop();

c=S1.top();

S1.pop();

d=c-b;

S1.push(d);

}

if(a=='*'){

b=S1.top();

S1.pop();

c=S1.top();

S1.pop();

d=c*b;

S1.push(d);

}

if(a=='/'){

b=S1.top();

S1.pop();

c=S1.top();

S1.pop();

d=c/b;

S1.push(d);

}

if(a=='^'){

b=S1.top();

S1.pop();

c=S1.top();

S1.pop();

d=pow(c,b);

S1.push(d);

}

}

int main()

{

char a[50],e;

int num;

int sum=0;

cin.getline(a,50);

for(int i=0;i

if(a[i]>='0'&&a[i]<='9'){

num=0;

while((a[i]>='0'&&a[i]<='9')){

num=num*10+(a[i]-'0');

i++;

}

S1.push(num);

//cout<

i--;

}

if(!isdigit(a[i])){

if(S2.empty()){

S2.push(a[i]);

//cout<

}

//^

else if(a[i]=='^'){

if(S2.top()!='^') S2.push(a[i]);

else{

while(!S2.empty()&&S2.top()=='^'){

Calculate(S2.top());

S2.pop();

}

S2.push(a[i]);

}

}

//* /

else if(a[i]=='*'||a[i]=='/'){

while(!S2.empty()&&S2.top()!='+'&&S2.top()!='-'&&S2.top()!='('){

Calculate(S2.top());

S2.pop();

}

S2.push(a[i]);

}

//+ -

else if(a[i]=='+'||a[i]=='-'){

while(!S2.empty()&&S2.top()!='('){

Calculate(S2.top());

S2.pop();

}

S2.push(a[i]);

}

else if(a[i]=='(') S2.push(a[i]);

else if(a[i]==')'){

while(!S2.empty()&&S2.top()!='('){

Calculate(S2.top());

S2.pop();

}

S2.pop();

}

}

}

while(!S2.empty()){

Calculate(S2.top());

S2.pop();

}

cout<

return 0;

}

运用c++需要用到118行代码,但是运用python,一行代码就可以解决,python代码如下:

print(eval(input().replace('/','//').replace('^','**')))

人生苦短,我用python。

Python 中,可以通过使用来实现中缀表达式求值。具体步骤如下: 1. 定义一个操作符优先级字典,用于判断两个操作符的优先级,方便后续比较。 2. 定义一个数字和操作符。 3. 从左到右遍历中缀表达式中的每一个元素。 4. 如果当前元素是数字,则将该数字入。 5. 如果当前元素是左括号,则将左括号入操作符。 6. 如果当前元素是右括号,则执行以下操作: a. 将操作符中的元素弹出,直到遇到左括号为止。弹出的操作符依次与数字中的两个数字进行计算,并将计算结果入。 b. 将左括号弹出。 7. 如果当前元素是操作符,则执行以下操作: a. 如果当前操作符的优先级小于或等于顶操作符的优先级,则将顶操作符弹出,并将其与数字中的两个数字进行计算,并将计算结果入。 b. 否则将当前操作符入操作符。 8. 最终,数字中剩余的唯一元素即为表达式计算结果。 以下是 Python 的代码实现: ``` def infix_eval(expression): precedence = {'+': 1, '-': 1, '*': 2, '/': 2, '**': 3} num_stack = [] op_stack = [] tokens = expression.split() for token in tokens: if token.isdigit(): num_stack.append(int(token)) elif token == '(': op_stack.append(token) elif token == ')': while op_stack[-1] != '(': op = op_stack.pop() num2 = num_stack.pop() num1 = num_stack.pop() result = apply_op(op, num1, num2) num_stack.append(result) op_stack.pop() elif token in precedence: while op_stack and op_stack[-1] != '(' and precedence[token] <= precedence[op_stack[-1]]: op = op_stack.pop() num2 = num_stack.pop() num1 = num_stack.pop() result = apply_op(op, num1, num2) num_stack.append(result) op_stack.append(token) while op_stack: op = op_stack.pop() num2 = num_stack.pop() num1 = num_stack.pop() result = apply_op(op, num1, num2) num_stack.append(result) return num_stack[0] def apply_op(op, num1, num2): if op == '+': return num1 + num2 elif op == '-': return num1 - num2 elif op == '*': return num1 * num2 elif op == '/': return num1 / num2 elif op == '**': return num1 ** num2 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值